2012-09-19 4 views
-1

작업 디렉토리에있는 dll로드를 방지하고 지정한 다른 위치에서 dll을 강제로 사용할 수 있습니까? dll을 작업 디렉토리에로드하는 것을 방지합니다. InvalidCastException 유형 A를 유형 B로 변환 할 수 없습니다.

나는 몇 가지 단위 테스트를 실행하려고이 InvalidCast 예외를 얻고있다 :

[A] AssemblyA.DataType는 [B] AssemblyA.DataType으로 캐스팅 할 수 없습니다. 형식 A 은 'AssemblyA, 버전 = 1.0.4645.21698, 문화 = 중립, PublicKeyToken = null'위치에서 'LoadFrom'위치의 'E : \ webservice \ bin \ AssemblyA \ AssemblyA.dll'에서 비롯되었습니다. 형식 B는 'E : \ TestResults \ Out \ AssemblyA.dll'위치의 'DefaultA'컨텍스트에서 'AssemblyA, 버전 = 1.0.4645.21698, 문화 = 중립, PublicKeyToken = null'입니다.

테스트 시작에

, 그것은 E에서 DLL을로드 할 Assembly.LoadFrom이를 사용하는 일부 초기화 코드를 호출 : \ \ 빈 \ AssemblyA \ AssemblyA.dll 및 웹 서비스 유형의 일부를 생성하고 캐시에 넣어.

dll을 해당 위치로 xcopy하는 빌드 후 이벤트가 있으므로 두 위치에서 정확히 동일한 dll입니다.

단위 테스트는 E : \ testresults \ out \의 작업 디렉토리에서 실행되므로 이미로드 된 어셈블리를 무시하고 자동으로 AssemblyA.dll을로드합니다. Appdomain.AssemblyResolve 이벤트

단위 테스트 코드가 E : \ webservice \ bin \ AssemblyA \ AssemblyA.dll에서 가져온 캐시에서 개체를 검색하려고하면 형식이 예상되는 잘못된 캐스팅이 발생합니다. E : \ TestResults \ Out \ AssemblyA.dll

Best Practices for Assembly Loading을 살펴본 후 작업 감독에서 dll을로드하지 못하도록하는 방법이없는 것처럼 보입니다. y, 비록 내가 이미 수동으로 사용하고 싶은 DLL을로드했다. E : \ webservice \ bin ...에서 응용 프로그램을로드하지 않고 응용 프로그램을 변경하는 것 이외의 옵션이 있습니까?

는 ..

+0

어셈블리를 참조하는 이유가 정확히 이해가 안됩니까? 그런데 CLR의 기본로드 동작을 끌 수는 없습니다. –

+0

이것은 단순히 시스템의 기존 아키텍처이므로 다른 하위 폴더에있는 약한 dll이라는 다른 버전의 로딩을 허용하도록이 방법으로 설정되었습니다. 동일한 결과를 얻을 수있는 더 좋은 방법이 있을지 모르겠지만 지금은 그 방법이 무엇인지 고집합니다. 이전에는 단위 테스트가 없었기 때문에 결코 문제가되지 않았습니다. – BrandonAGr

+0

다른 단위 테스트를 작성하는 것이 좋습니다. 'test projectA'는'assemblyA'를 참조하고 그것을 테스트하고 있습니다. 또 다른'시험 프로젝트 B'는 어셈블리 B를 참조하고 테스트하는 것입니다. 이 아이디어인가? –

답변

1

Panos가 위의 주석에서 제안했듯이 참조 된 어셈블리에 CopyLocal = false를 설정하여이 문제를 해결했습니다. 그렇게하면 CLR은 dll이 없기 때문에 작업 디렉토리에서 dll을로드 할 수 없습니다.

1

지금, 나는 문제가 당신의 당신을 도우려고 (사용 LoadFile과 같은 지시어 또는로드 바이트 [] 모두 같은 오류가 발생)

은 내가 StrongName으로 어셈블리에 서명하는 것이 좋습니다 .

CLR은 어셈블리를 식별하는 데 사용합니다. 이것은 거의 당신의 문제를 해결하지 못합니다. 그러나 문제를 해결하기 위해 인터페이스를 사용하여 다른 유형을 캡슐화하는 것이 좋습니다. 따라서 캐시에 모든 유형을 저장하고 intrerface 만 리턴하면 캐스트가 사라집니다.

문제가 해결되지 않으면 나에게 추가 정보를 제공해야합니다.

+0

결국 시스템을 개선하는 것이 좋습니다. 지금은 테스트중인 코드를 다시 작성하여 다른 어셈블리에서로드 된 유형과 상호 작용하지 않도록하겠습니다. 그래서 두 개의 어셈블리가 여전히로드되지만 InvalidCastException을 발생시키지 않습니다. – BrandonAGr

관련 문제