2014-05-22 1 views
2

두 개의 써드 파티 DLL이 있는데 두 가지 모두 강력한 이름이 아닙니다. 나는 app.config에서 이러한 dll을 참조하여 네트워크에서 한 번 그들을 찾을 수 있고 그들을 사용하는 각 응용 프로그램에 대해 여러 번 복사를 피할 수 ... 내가 이해할 때까지 assemblyBindingapp.config 파일을 통해 그들을 참조로 그들은 강하게 - 이름 :제 3 자 dll에서 dll 참조를 변경할 수 있습니까?

<runtime> 
    <dependentAssembly> 
    <assemblyIdentity name="External" culture="neutral" publicKeyToken="xxxx"/> 
    <codeBase version="1.0.0.0" href="FILE://N://Lib/External.dll"/> 
    </dependentAssembly> 
... 

그래서 서명해야합니다. .NET-fu: Signing an Unsigned Assembly (Without Delay Signing) 덕분에 내 *.snk 파일로 서명 관리 :

ildasm /all /out=Bar.il Bar.dll 
ilasm /dll /key=Foo.snk Bar.il 

그럼 내가 서명 된 것들과 내 솔루션에 대한 참조를 교체 falseCopyLocaly을 설정합니다. 그 다음에 으로 파일 app.config을 편집했습니다.

그러나 내 응용 프로그램을 실행할 때 나는 로더가 publicKeyToken=null 인이 DLL 중 하나를 찾을 수 없다는 의미로 여전히 FileLoadException이됩니다.

그래서 나는이 dll이 다른 dll을 참조하고, 그 참조가 확실히 다른 dll의 서명 된 버전에 대해 아무것도 모른다고 결정했다.

여기에 질문이옵니다. 첫 번째 DLL 안의 참조를 두 번째 서명 된 버전으로 변경하는 방법이 있습니까? 또는 내 유일한 옵션은이 DLL에 app.config을 사용하지 않고 코드로 수동으로로드하는 것입니다 (예 : Assembly.LoadFrom)?

답변

2

결국 꽤 쉬워 보입니다. 제 DLL에 대한 레퍼런스를 포함하는 DLL의 *.il 파일 I 번째 DLL의 이름 다음 항목 발견

.assembly extern /*23000002*/ SecondDllName 
{ 
    .ver 1:0:0:0 
} 

및 I는 생성 첨가 즉

.assembly extern /*23000002*/ SecondDllName 
{ 
    .publickeytoken = (xx xx xx xx xx xx xx xx) 
    .ver 1:0:0:0 
} 

로 변경 공개 키 토큰.

은 그 때 나는

ilasm /dll /key=Foo.snk Bar.il 

로 DLL을 재 조립 그리고 그것은했다.

관련 문제