문제

시나리오를 제공 한 다음 누군가가 솔루션 / 작업을 가지고 있는지 확인하겠습니다.

클래스 만 포함하는 라이브러리 (DLL)가 있습니다. 다른 라이브러리에는 첫 번째 라이브러리의 클래스가 구현하는 인터페이스가 있습니다. 클라이언트는 항상 인터페이스를 포함하는 라이브러리의 하나의 버전 만 참조하며 (항상 최신 제품), 해당 인터페이스 (더 많은 인터페이스 / 메소드)에 추가 만 추가됩니다. 또한 해당 인터페이스 라이브러리의 버전 만 있으면 클라이언트가 참조를 업데이트 할 필요가 없습니다 (인터페이스 라이브러리는 반사를 통해로드됩니다. 따라서 일반적인 프로빙 규칙은 적용되지 않으므로 클라이언트가 구체적으로로드 할 수 있습니다. 요청). 인터페이스를 구현하는 라이브러리에는 다른 클라이언트가 동시에 참조하는 여러 버전이 있습니다.

클라이언트 어셈블리가 구현 라이브러리의 이전 버전을 참조 할 때 문제가 발생합니다. 구현 라이브러리의 클래스 유형에서 객체를 생성 한 다음 다른 클라이언트 어셈블리로 전달합니다. 해당 클라이언트 어셈블리는 최신 (및 전용) 버전의 인터페이스 라이브러리를 사용하고 적절한 인터페이스 유형으로 전달 된 객체를 캐스팅하려고 시도합니다. 이 캐스트는 'System.typeloadexception : Assembly Z의 유형 x의 메소드 x에 구현이 없습니다'로 실패합니다. 인터페이스의 새 버전 (동일한 버전 번호 -Ald Library Clobbered)에서 메소드 X가 정의되기 때문에이 예외는 예상되었지만 전달 된 객체의 이전 버전에는 해당 인터페이스를 구현하는 메타 데이터가 포함되어 있어도 해당 클래스에서 구현이 없기 때문에 새 인터페이스 메소드 X에서 매핑이 실패합니다.

그래서 내 질문은 이것입니다. 클라이언트가 해당 인터페이스를 사용하도록하는 방법이 있지만 참조 된 객체에서 구현되지 않은 메소드가 호출 될 때만 예외 만 유발합니까 (참조 된 객체가 최신 인터페이스 유형에 캐스트 될 때 생성되는 예외가 아니라)?

그건 그렇고 -Teart Binding은 Intellisense / Compile Time Type Checking을 원하기 때문에 옵션이 아닙니다 ... 또한 기능 포인터 및 래퍼 클래스 로이 작업을 수행하는 방법을 알고 있습니다. 일반 .NET 유형으로 조정하십시오.

감사합니다 - 모든 도움에 감사드립니다

도움이 되었습니까?

해결책

인터페이스가 포함 된 라이브러리의 인터페이스 대신 초록 (Mustinherit) 클래스를 사용하고 메소드와 속성을 재정의 가능한 것으로 설정할 수 있습니다. 이 방법으로 메소드가 구현되지 않은 예외를 던지더라도 인터페이스 라이브러리의 모든 방법에 대한 구현이 항상 있습니다. 메소드를 꼭 가질 수있는 방법을 대체 할 수있게함으로써 타자식을 피해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top