2010-07-06 1 views
0

내 응용 프로그램은 Microsoft Enterprise 라이브러리 V4.1을 참조하며 이전 DLL (외부 응용 프로그램) 중 하나는 Microsoft Enterprise 라이브러리 V2.0을 참조해야합니다. GAC에서이 두 어셈블리를 모두 등록 할 수 있다는 것을 알고 있습니다. 응용 프로그램은 필요에 따라 관련 DLL을 읽지 만 보안 전문가가이 솔루션을 수락 할 때 동의하지 않으므로 솔루션을 사용할 수 없습니다.Microsoft 응용 프로그램 블록 DLL V2 및 V4.1 참조

전체 응용 프로그램에서 4.V0을 사용하는 동안 이전 DLL이 V2.0을 사용하도록 구체적으로 지정할 수있는 방법이 있습니까?

참고 : 우리는 Asp.net 비주얼 스튜디오 C 번호를 필사적으로 필요

도움말을 사용하고 있습니다! 감사

는 업데이트 :

프로빙 privatePath를 사용하는 솔루션을 시도 :

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;ExtDLL"/> 
    </assemblyBinding> 

내 웹 폴더는 이제 Microsoft 엔터프라이즈 라이브러리 V2.0.0.0 DLL을 포함 ExtDLL 폴더를 가지고,하지만 여전히 나는 곧바로 V2.0.0.0 어셈블리를 사용하는 외부 DLL의 함수를 호출하면 다음 예외가 발생합니다.

...System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

답변

0

probing/privatePath 또는 코드베이스 구성을 사용하여 두 버전의 Enterprise Library를 모두로드 할 수 있습니다.

내가 작동하게하는 유일한 방법은 custom resolving of assembly loads.입니다.

2.0 어셈블리를 응용 프로그램 bin 디렉토리에 배치했습니다. 그런 다음 4.1 어셈블리를 bin 아래 EL41이라는 디렉토리에 두었습니다 (bin \ EL41). 나는 다음 MyResolveEventHandler

private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) 
{ 
    string[] assemblyInfo = args.Name.Split(','); 
    return Assembly.LoadFrom(@"file:///C:/Documents and Settings/My Documents/Visual Studio 2008/Projects/App/bin/EL41/" + assemblyInfo[0] + ".dll"); 
} 

이 확실히 작동을 만드는 다음 코드를 시작하지

AppDomain.CurrentDomain.AssemblyResolve += newResolveEventHandler(MyResolveEventHandler); 

을 추가하고하여 조립 해결을 위해 사용자 정의 이벤트 처리기를 추가했다. 위치를 하드 코딩하는 것을 피하기 위해 경로를 구성 할 수는 있지만 여전히 나에게 잘못된 느낌을줍니다. 당신이 원하는 것을하기에 덜 방해적인 방법이 있는지 궁금합니다.

1

시도해 보셨습니까? 이것은 현재 GAC를 피하면서 응용 프로그램에서 여러 버전의 DLL을 지원하는 데 사용하는 기술입니다.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="MyLibrary" publicKeyToken="605f591b87e816bd"/> 
    <codeBase version="1.0.0.0" href="./v1/MyLibrary.dll"/> 
    <codeBase version="2.0.0.0" href="./v2/MyLibrary.dll"/> 
    </dependentAssembly> 
</assemblyBinding> 

만들기 있는지 당신은 :

귀하의 DLL을 강하게가
  • 적절한 디렉토리 구조 (V1/MyLibrary.dll 및 v2/MyLibrary.dll) 바이너리 폴더
  • 에 이름이 지정됩니다
    1. 이 '하위 폴더'에 나타나는 DLL 중 이진 폴더 내에 직접 나타나지 않아야합니다.

      ./MyLibrary/1.0.0.0__605f591b87e816bd/ : -

    이 간단한 해결책입니다하지만 난 당신이 실제로 사용 같은 당신의 하위 폴더의 이름을 것을 권하고 것 같은, 그들은 GAC에있을 것입니다 MyLibrary.dll

    ./MyLibrary/2.0.0.0__605f591b87e816bd/MyLibrary.dll

    ./MyLibrary/2.0.0.0_en_605f591b87e816bd/MyLibrary.dll (이 지역화 위성 어셈블리이다 빌드의 예 할 것이다 항상 이런 것처럼 보임)