작업 디렉토리에있는 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 ...에서 응용 프로그램을로드하지 않고 응용 프로그램을 변경하는 것 이외의 옵션이 있습니까?
는 ..
어셈블리를 참조하는 이유가 정확히 이해가 안됩니까? 그런데 CLR의 기본로드 동작을 끌 수는 없습니다. –
이것은 단순히 시스템의 기존 아키텍처이므로 다른 하위 폴더에있는 약한 dll이라는 다른 버전의 로딩을 허용하도록이 방법으로 설정되었습니다. 동일한 결과를 얻을 수있는 더 좋은 방법이 있을지 모르겠지만 지금은 그 방법이 무엇인지 고집합니다. 이전에는 단위 테스트가 없었기 때문에 결코 문제가되지 않았습니다. – BrandonAGr
다른 단위 테스트를 작성하는 것이 좋습니다. 'test projectA'는'assemblyA'를 참조하고 그것을 테스트하고 있습니다. 또 다른'시험 프로젝트 B'는 어셈블리 B를 참조하고 테스트하는 것입니다. 이 아이디어인가? –