내 경우에는 Consumer
클래스, IExposedIface
인터페이스 및 IExposedIface
을 구현하는 Exposed
클래스의 세 가지 구성 요소가 있습니다. Consumer
과 Exposed
은 모두 IExposedIface
으로 정적으로 연결되지만 Consumer
은 Exposed
에 대한 컴파일 타임 참조가 없습니다.동적으로로드하는 어셈블리 :이 코드가 작동하는 이유는 무엇입니까?
내가 Consumer
런타임에 Exposed
의 다른 버전을로드 할 수 있도록 해주는 계획을 마련하기 위해 노력하고 (입력 데이터에 따라 -의 각 입력 문서를 처리하는 데 사용되어야한다 Exposed
의 버전에 대한 정보를 전달하는 가정 해 봅시다) . 이것을 성취하기 위해 나는 AppDomains을 공부하기 시작했으며 이제 기본 버전이 작동하게되었습니다.
지금까지 조립품 Exposed
에 IExposedIface
조립품을 제공하는 데는 두 가지 옵션이 있습니다.
만
Consumer
에IExposedIface.dll
를 갖는 '의 빈 디렉토리와있는 내가Consumer
에IExposedIface.dll
모두를 갖는Exposed
의 인스턴스를 생성하고있는
AppDomain
에 대한AppDomain.AssemblyResolve
이벤트를 처리의 빈 디렉토리를 뿐만 아니라 각Exposed.dll
을 제쳐두고.public interface IExposedIface { string SaySomething(); }
나는이
IExposedIface
에 대해Consumer
을 구축 :
는 지금이 IExposedIface
에 대해 Exposed
을 구축 할 것을 고려 첫 번째 경우에
public interface IExposedIface
{
string SaySomething();
string SaySomethingDifferent();
}
, 예외를
예외 : 방법 'SaySomethingDifferent' 유형은 구현이없는 ', PublicKeyToken = null의 문화 = 중립 버전 = 1.0.0.0, 노출' 어셈블리에서 'Exposed.Exposed'.
은 내가 갓 만든 응용 프로그램 도메인에 Exposed
의 인스턴스를 생성 appDomain.CreateInstanceAndUnwrap(...)
를 호출하는 순간에 발생합니다.
나에게 맞는 것 같습니다.
두 번째 경우에는 appDomain.CreateInstanceAndUnwrap(...)
이 정상적으로 처리되며 검색된 개체에서 'SaySomething()'메서드를 호출해도 문제가 발생하지 않습니다. 예외
있어서 'SaySomethingDifferent는'문화 = PublicKeyToken = NULL 중립 버전 = 2.0.0.0, IExposedIface.IExposedIface, IExposedIface '인터페이스/타입 발견되지 않았다.
은 실제로 SaySomethingDifferent()
을 Consumer
에 호출했을 때 발생합니다.
나는이 두 번째 사례에서 CLR이 지금까지 나를 놓아 버렸다는 사실에 놀랐다. 왜 누군가가 이것이 가능한지 설명 할 수 있었 을까?