2012-08-24 7 views
0

다른 응용 프로그램에서 사용하는 DLL이 있습니다. 그것은 상당히 정기적으로 업데이트되는 타사 DLL을 사용합니다. 필요 이상 버전이 존재하는 한 나는 행복하다.DLL에 AppDomain.CurrentDomain.AssemblyResolve에 연결하는 방법

하지만 Visual Studio는 내 DLL을 사용하는 응용 프로그램에 필요한 정확한 버전을 적용합니다.

이벤트 처리기를 AppDomain.CurrentDomain.AssemblyResolve에 추가하여 이후 버전을 확인하고 사용할 수 있습니다. 그러나 나는 그것을 어디에 추가 할 지 모른다.

대부분의 응용 프로그램은 program.cs 시작시이를 넣습니다. 그러나 dll에는 그러한 것이 없습니다.

정적 생성자에 넣을 것이지만이 타사 DLL을 사용하는 많은 클래스가 있습니다. 이 이벤트를 각 클래스에 첨부하는 것은 지저분 해 보입니다.

다른 옵션이 있습니까? 당신은 당신이 "리디렉션"할 유형을 해결하기 전에

private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e) 
{ 
    try 
    { 
     string[] assemblyDetail = e.Name.Split(','); 
     string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
     Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll"); 
     return assembly; 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("Failed resolving assembly", ex); 
    } 
} 

확실 AssemblyResolve에 위임의 할당이 완료되어 있는지 확인 :

+0

타사 DLL이 관리되거나 관리되지 않습니까? 질문에서 나는 관리한다고 생각합니다. –

+0

.config 파일이이를 처리해야합니까? – leppie

+0

또는 타임 스탬프가있는 프로파일 러를 사용하여 가장 먼저 발생하는 경향을 확인하십시오. 매우 흩어져있는 도서관의 경우 힘들 것입니다. – leppie

답변

1
+0

예,하지만 여기에 첨부합니까? dll에는 OnLoad 메서드가 없으므로 오류가 발생하기 전에 첨부 할 수 있습니다. (질문의 요점입니다.) – Vaccano

+0

dll의 관점에서, 리디렉션하려는 유형이로드되기 전에 해당 DLL을로드해야합니다. Main()에서 * 할 필요없이, 그것을 보장 할 방법이 없습니다. 어느 시점에서, 기본적으로 메인에서 이벤트 구독을해야합니다. –

1

assembly binding redirect을 사용할 수 있습니까?

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Foo.Bar" publicKeyToken="***" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.1"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+0

이것이 최고의 솔루션입니다. 나는 그것을 좋아하지 않는다. 왜냐하면 내 dll을 사용하는 응용 프로그램이 내가하는 것과 같은 버전이 없다는 사실을 다루기 때문이다. (나는이 코드를 잊어 버린 사람들에게 두통을 일으키지 않는다.). – Vaccano

관련 문제