동일한 폴더에서 동일한 어셈블리의 다른 버전 사용
나는 다음과 같은 상황이 있습니다
프로젝트 A
- Uses Castle Windsor v2.2
- Uses Project B via WindsorContainer
프로젝트 B
- Uses NHibernate
- Uses Castle Windsor v2.1
프로젝트 AI의 bin 폴더에는 dll Castle.DynamicProxy2.dll v2.2 및 NHibernate dll이 있습니다. 이제 문제는 NHibernate가 Castle.DynamicProxy2.dll v2.1에 종속되어 있다는 것입니다. 이 상황을 어떻게 해결합니까?
다음 구성을 사용하여 문제를 해결했습니다.
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Castle.DynamicProxy2" publicKeyToken="407dd0808d44fbdc" />
<codeBase version="2.1.0.0" href="v2.1\Castle.DynamicProxy2.dll" />
<codeBase version="2.2.0.0" href="v2.2\Castle.DynamicProxy2.dll" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" />
<codeBase version="1.1.0.0" href="v2.1\Castle.Core.dll" />
<codeBase version="1.2.0.0" href="v2.2\Castle.Core.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
그가 충분한주의를 기울이지 않으면 놓칠 수있는 매우, 매우, 매우 중요한 한 가지.
codeBase 버전 태그에 작성하는 어셈블리 는 강력한 이름 이어야합니다 .
다음 링크에서 : http://msdn.microsoft.com/en-us/library/efs781xb.aspx
강력한 이름이없는 어셈블리의 경우 버전이 무시되고 로더는 <dependentAssembly> 내에서 <codebase>의 첫 번째 모양을 사용합니다. 바인딩을 다른 어셈블리로 리디렉션하는 항목이 애플리케이션 구성 파일에있는 경우 어셈블리 버전이 바인딩 요청과 일치하지 않더라도 리디렉션이 우선 적용됩니다.
한 가지 해결책 (또는 해결 방법)은 소프트웨어를 실행해야하는 컴퓨터의 GAC ( Global Assembly Cache )에 두 버전을 모두 설치 하고 강력한 이름을 사용하여 어셈블리를 참조하는 것입니다. 이것은 어셈블리에 실제로 강력한 이름이 있다고 가정합니다.
개발자가 몇 명 이상이거나 솔루션을 여러 컴퓨터에 배포하려는 경우 (예 : 최종 사용자 응용 프로그램) GAC에 설치하는 것이 어려울 것입니다. 이 경우 유일한 옵션은 두 버전 중 하나를 해당 버전이 필요한 어셈블리 에 병합 하는 것입니다. 특정 경우에 Castle.DynamicProxy2.dllv2.1을 NHibernate.dll.
ILMerge 라는 도구를 사용 하여 어셈블리를 병합 할 수 있습니다 . 실행해야하는 명령은 다음과 같습니다 (예상되지 않음).
ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
NHibernate.dll Castle.DynamicProxy2.dll
/internalize스위치는 제 조립체 (여기서는 성)의 모든 유형을 표시 ILMerge 지시 internal어셈블리 출력한다. 이것이 없으면 새 NHibernate.dll버전과 Castle.DynamicProxy2.dllv2.2 의 선반 버전을 모두 참조하는 프로젝트를 컴파일하려고 할 때 컴파일 오류가 발생할 수 있습니다 . 이름이 정확히 같은 클래스를 포함하기 때문입니다.
Hemanshu Bhojak의 솔루션은 동일한 컨텍스트에 동일한 어셈블리의 두 가지 버전을로드하고 싶지 않기 때문에 좋은 솔루션이라고 생각하지 않습니다. 이 문서는 그 이유를 설명합니다
http://msdn.microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions
'Program Club' 카테고리의 다른 글
| React Router를 사용하여 페이지를 리디렉션하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.27 |
|---|---|
| C #의 코드로 네트워크 설정 (IP 주소, DNS, WINS, 호스트 이름)을 어떻게 변경할 수 있습니까? (0) | 2020.11.27 |
| 이 Ruby 객체에 동일한 작업을 수행하는 것처럼 보이는 to_s 및 inspect 메서드가 모두있는 이유는 무엇입니까? (0) | 2020.11.27 |
| .a .o와 .lo 파일의 차이점 (0) | 2020.11.27 |
| Double.parseDouble (String)과 Double.valueOf (String)의 차이점은 무엇입니까? (0) | 2020.11.27 |