2017-05-01 3 views
2

C# 데스크톱 코드와 함께 사용하는 타사 응용 프로그램이 있습니다. 필자는 제조업체가 제공하는 라이브러리에서 여러 인터페이스를 사용합니다. 라이브러리는 여러 개의 DLL로 구성되어 있으며 인터페이스에 대한 하나의 DLL에 액세스합니다. 저는 응용 프로그램의 새 버전을 릴리스 할 때 몇 가지 문제가 있음을 발견했습니다.이전 어셈블리의 인터페이스로 컴파일 된 .Net 응용 프로그램이 새 버전의 개체를 만들 수 있습니까?

설치 코드는 내 개발 컴퓨터에서 참조했던 DLL을 프로젝트 bin 폴더에 복사했습니다. 내가 인터페이스의 concreate 인스턴스를 구현하기 전에 일시적으로 DLL에 경로를 추가하고 빌드하는 동안 그것을 복사하지 않도록 수정.

문제는 지금 객체를 만들 수 없다는 것입니다. 오류 :

Unable to cast object of type ‘ThirdPartyObject’ to type ‘IThirdPartyObject’. 

내 소스 코드는 DLL의 다른 버전을 참조하고 있기 때문이라고 생각합니다. 프로그램이 실행되면 컴파일 된 것과 동일하지 않다는 것을 알게됩니다. 이는 버전간에 서명이 동일하고 공개 키 토큰이 동일하더라도 마찬가지입니다.

저는 VS 개체 탐색기에서 사용하는 인터페이스의 서명을 시각적으로 비교했으며 일치합니다.

새로운 DLL을 내 컴퓨터의 폴더에 복사하고이 DLL을 참조하여 다른 방법으로 시도했습니다. 컴파일 한 후 컴퓨터에서 캐스팅 오류가 발생하고 테스트 컴퓨터에서 작동합니다.

그렇지 않으면 Binding Redirect가 어떻게 작동할까요?

수동으로 어셈블리를로드하는 방법에 대해 생각했지만 어떻게 메소드에 액세스합니까? 조회 방법을 살펴보면 쉽지 않은 것처럼 보입니다. 내 인터페이스와 어댑터를 만들어야 내 인터페이스를 매핑 할 수 있을까요?

+0

물론 다른 버전이 표준 원인입니다. .NET 형식의 ID는 네임 스페이스 + 형식 이름 (역할을 수행하지 않는 형식의 멤버) 일뿐만 아니라 완전히 지정된 어셈블리 이름도 포함됩니다. [AssemblyVersion]은 중요합니다. 업데이트 된 참조 어셈블리로 다시 컴파일해야합니다. 공급자에게 인터페이스를 안정화시키고 간과하기 쉽고 (일반적으로) 쉽게 수정할 수 없다는 사실을 고려해야한다는 것을 공급자에게 알리는 것은 상처가되지 않습니다. –

+0

버그 수정 버전이 출시 될 때마다 다시 컴파일해야합니까? 원본의 전체 이름은 다음과 같습니다. SDK.NET.Interface, Version17.1.0.0, Culture = 중립, PublicKeyToken = b77a5c561934e089 새 버전 : SDK.NET.Interface, Version17.1.1.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 버그 수정을 반영하여 버전을 변경해야한다고 생각합니다. –

+0

.config 파일의 BindingRedirect는 일반적으로 이러한 사소한 차이를 설명합니다. 그러나 업데이트 된 어셈블리를 배포하는 것이 중요합니다. –

답변

0

해결책은 프로그램을 컴파일 할 때 참조한 어셈블리의 버전을 반영한 주 응용 프로그램의 App.Config에서 BindingRedirect를 사용하는 것이 었습니다.

대상 어셈블리를 참조하는 프로젝트의 App.Config에 배치하려고 시도했지만 눈에 띄는 효과가 없습니다. XML 블록을 주요 실행 파일 인 App.Config로 옮기면 작동합니다.

<configuration> 
    <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="SDK.NET.Interface" 
          publicKeyToken="865eaf3445b2ea56" 
          culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" 
         newVersion="17.1.1.0"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

사이드 노트. 참조 된 dll이 기본 실행 파일에서 참조되지 않았기 때문에 설치 프로그램의 설치 파일 목록에 수동으로 추가해야했습니다. 장기적으로이 모듈은 선택 사항이며이 종속성이 필요하지 않으므로 기본 프로젝트의 참조에 추가하고 싶지 않을 수 있습니다.

0

이전 어셈블리의 인터페이스로 컴파일 된 .Net 응용 프로그램은 새 버전으로 개체를 만들 수 있습니까?

타사 회사가 인터페이스를 보유하고 다른 회사가 코드를 보유하도록 어셈블리를 분할하는 경우 원하는 작업을 수행 할 수 있습니다.

하지만 인터페이스가 특정 버전으로 태그 지정되어 있으므로 이름/네임 스페이스가 같은 곳에 캐스팅 오류가 발생합니다.

설치 코드가 내 개발 컴퓨터에서 참조했던 DLL을 프로젝트 bin 폴더로 복사했습니다.

다른 위치에 설치하면 도움이되거나로드되지 않습니다. 이미 프로젝트 자체가 하나의 작품을 만드는 것에 대해 언급했습니다.

유일한 옵션은 코드를 새 버전으로 업데이트하거나 전혀 업데이트하지 않는 것입니다.

관련 문제