2011-11-19 4 views
0

내 경우에는 Consumer 클래스, IExposedIface 인터페이스 및 IExposedIface을 구현하는 Exposed 클래스의 세 가지 구성 요소가 있습니다. ConsumerExposed은 모두 IExposedIface으로 정적으로 연결되지만 ConsumerExposed에 대한 컴파일 타임 참조가 없습니다.동적으로로드하는 어셈블리 :이 코드가 작동하는 이유는 무엇입니까?

내가 Consumer 런타임에 Exposed의 다른 버전을로드 할 수 있도록 해주는 계획을 마련하기 위해 노력하고 (입력 데이터에 따라 -의 각 입력 문서를 처리하는 데 사용되어야한다 Exposed의 버전에 대한 정보를 전달하는 가정 해 봅시다) . 이것을 성취하기 위해 나는 AppDomains을 공부하기 시작했으며 이제 기본 버전이 작동하게되었습니다.

지금까지 조립품 ExposedIExposedIface 조립품을 제공하는 데는 두 가지 옵션이 있습니다.

  1. ConsumerIExposedIface.dll를 갖는 '의 디렉토리와있는 내가 ConsumerIExposedIface.dll 모두를 갖는 Exposed

  2. 의 인스턴스를 생성하고있는 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이 지금까지 나를 놓아 버렸다는 사실에 놀랐다. 왜 누군가가 이것이 가능한지 설명 할 수 있었 을까?

답변

0
  1. 케이스 # 1 Exposed.dll가 IExposedIface.dll 잘못된 버전에 대해 결합되는 것을 의미한다 - 메타 로더가 구현되지 않은 인터페이스 방법을 발견하기 때문 어셈블리를로드 할 때를 검출 할 수있다.

  2. 사례 2 (아마도)는 각 Exposed.dll 외에도 각 IExposedIface.dll의 올바른 버전을 보유하고 있으므로 각 어셈블리가 자체 AppDomain에서로드 할 수 있습니다. 그러나 AppDomain A는 AppDomain B와 다른 인터페이스를 가지고 있는데, 이것은 실제로 호출이 실제로 AppDomain 경계를 넘을 때만 문제가됩니다.

나는 그 바이너리 호환성 게임을 시도하지 제안 오히려 적절한 버전을 할 것 (예. IExposedIface.dll의 새 버전 하므로, 기존의 인터페이스에서 상속, 새로운 방법과 새로운 인터페이스를 생성 정말 이전 버전과 호환 가능). 그 외의 경우 은 실제로입니다. 우연히 모두 버전의 IExposedIface.dll이 Windows에 도달 할 수 있고 두 버전의 AppDomain이 있으면 문제가 발생하지 않으므로 디버그하기가 어렵습니다.

관련 문제