Program Club

동일한 폴더에서 동일한 어셈블리의 다른 버전 사용

proclub 2020. 11. 27. 21:40
반응형

동일한 폴더에서 동일한 어셈블리의 다른 버전 사용


나는 다음과 같은 상황이 있습니다

프로젝트 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

참고 URL : https://stackoverflow.com/questions/2460542/using-different-versions-of-the-same-assembly-in-the-same-folder

반응형