2012-02-13 14 views
2

アプリケーションでは、リリースされたすべてのアセンブリバージョン番号を事前に知ることができないサードパーティアセンブリを動的にロードする必要があります。たとえば、アセンブリのメジャーバージョン番号は「12」でなければならないことがわかります。 PCでは、同一のアセンブリの複数のバージョンがインストールされ、メジャーバージョン番号の上位と下位の両方がインストールされます。ワイルドカードを使用してアセンブリをGACからロードする方法

I.e.我々は

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

ようなものが必要でしょうし、アセンブリはバージョン11.1.2.3、12.7.6.5、および13.9.8.7がインストールされている場合、それはバージョン12.7.6.5をロードする必要があります。

I.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

ありがとう、それは私のために働いた。私はこのようなディレクトリ検索が遅すぎるかもしれないと恐れていましたが、いくつかのテストを行いましたが、実際はかなり速かったです。 –

関連する問題