2012-02-13 2 views
2

인 GAC에서 어셈블리를로드하는 방법이 응용 프로그램에서는 릴리스 된 어셈블리 버전 번호를 모르는 경우 제 3 자 어셈블리를 동적으로로드해야 할 필요가 있습니다. 예를 들어, 어셈블리의 주 버전 번호는 "12"여야합니다. PC에서는 동일한 어셈블리의 여러 버전이 설치 될 수 있으며 상위 버전과 하위 버전이 모두 있습니다.와일드 카드로 버전 번호가

e.e. 우리는

Assembly myAssembly = Assembly.Load("SampleAssembly, Version=12.*.*.*"); 

같은 것을 필요 및 11.1.2.3, 12.7.6.5 및 13.9.8.7가 설치되어 어셈블리 버전의 경우, 버전 12.7.6.5을로드해야합니다.

e.e. 버전 번호 구성 요소에 대해 와일드 카드를 지정할 수 있어야하며 CulturePublicKeyToken을 생략 할 수 있어야합니다. Assembly.Load()으로 처리하면 FileNotFoundException이됩니다.

Assembly.LoadWithPartialName()은 항상 가장 높은 버전 번호의 어셈블리를로드하기 때문에 사용할 수는 없지만 대신 가장 큰 버전의 어셈블리 버전 번호보다 작은 특정 주요 버전 번호가 필요합니다.

가능합니까?

+0

로 와일드 카드에 비교할 수 woldcards, 나는 AssemblyResolve 이벤트 및 버전 검사와 함께 사용자 정의 방식을 사용합니다.이 답변을 참조하십시오. http://stackoverflow.com/questions/1235253/how-is-an-assembly-resolved-in-net –

+0

@Davide : AssemblyResolve를 올바르게 이해하면 어셈블리로드가 실패하고 이벤트 처리기가 올바른 어셈블리 위치를 반환해야만 발생합니다. AssemblyResolve의 이벤트 인수가 사용 가능한 어셈블리 목록을 같은 이름으로 제공하지 않기 때문에 이것이 내 요구 사항에 어떻게 도움이 될지 모르겠다. –

+0

이것은 불가능합니다. 앱의 .config 파일에서''요소를 사용하십시오. –

답변

0

수동으로 GAC의 내용을 나열하고 당신이로드하는 가장 좋은/정확한 방법을 찾을 수없는 경우, 당신이 요청하는 것은, 단지 백업으로, 분명 그렇게

class Program 
{ 
    static void Main(string[] args) 
    { 
     var assemblyName = "SimpleAssembly"; 
     var versionRegex = new Regex(@"^12\."); 
     var assemblyFile = FindAssemblyFile(assemblyName, versionRegex); 

     if (assemblyFile == null) 
      throw new FileNotFoundException(); 

     Assembly.LoadFile(assemblyFile.FullName); 
    } 

    static FileInfo FindAssemblyFile(string assemblyName, Regex versionRegex) 
    { 
     var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "assembly", "GAC_MSIL", assemblyName); 
     var assemblyDirectory = new DirectoryInfo(path); 

     foreach (var versionDirectory in assemblyDirectory.GetDirectories()) 
     { 
      if (versionRegex.IsMatch(versionDirectory.Name)) 
      { 
       return versionDirectory.GetFiles()[0]; 
      } 
     } 

     return null; 
    } 
} 
+0

고마워, 그게 나를 위해 일했다. 이런 종류의 디렉토리 검색이 너무 느릴 까봐 두려웠지만 몇 가지 테스트를했는데 실제로는 꽤 빨랐습니다. –

관련 문제