5

リフレクションを使用して、インストールされているアセンブリの最新バージョンを GAC に動的にロードしたいと考えています。

これまでのところ、これを達成するための複数の実用的な方法を見つけましたが、それらにはすべて特定の欠点があります.

最も簡単な解決策は、Assembly.LoadWithPartialName()メソッドを使用することです。ただし、このメソッドは .NET Framework 2 以降では廃止されています。

var assembly = Assembly.LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime");

もう 1 つの可能性は、Assembly.Load()(古い警告で推奨されているように) を使用し、try/catch ブロックで完全修飾アセンブリ名を使用してさまざまなアセンブリ バージョンを呼び出し、インストールされている最新バージョンを取得することです。これはメンテナンスを求めて叫んでおり、ただ汚れているように見えます:

Assembly assembly = null;

try
{
    assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }

try
{
    assembly = Assembly.Load("Microsoft.WindowsAzure.ServiceRuntime, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
}
catch (FileNotFoundException) { }

最後になりましたが、メソッドを使用してSOでここで見つけた 別のソリューションAssembly.LoadFrom()があり、基本的にアセンブリマネージャーモジュールをインポートしてfusion.dll、最新バージョンのパスを把握します。これは、このような「単純な」タスクには多すぎるようです。

古いメソッドを使用せずに、魔法の文字列を使用してメンテナンス地獄を作成したり、アンマネージ コードを呼び出したりすることなく、これを達成するためのより良い解決策はありませんか?

前もって感謝します!

4

1 に答える 1

3

Fusion.dll... うーん。ターゲット フレームワークのバージョンを見つけて、すべてのガス ディレクトリを列挙し、ルート アセンブリ名に基づいて単純にクエリを実行して、唯一のマジック ストリングがアセンブリ名になるようにします。次に、Assembly.ReflectionOnlyLoadFrom 静的メソッドを使用して のバージョンを比較し、最新のものを見つけてから、Assembly.Load メソッドを適切なファイル パス引数と共に使用します。アプリに適切な信頼を与えていない限り、クリック ワンス ダウンロードを使用すると問題が発生する可能性があります。

// List of all the different types of GAC folders for both 32bit and 64bit
// environments.
List<string> gacFolders = new List<string>() { 
    "GAC", "GAC_32", "GAC_64", "GAC_MSIL", 
    "NativeImages_v2.0.50727_32", 
    "NativeImages_v2.0.50727_64" 
};

foreach (string folder in gacFolders)
{
    string path = Path.Combine(@"c:\windows\assembly", folder);
    if(Directory.Exists(path))
    {
        Response.Write("<hr/>" + folder + "<hr/>");

        string[] assemblyFolders = Directory.GetDirectories(path);
        foreach (string assemblyFolder in assemblyFolders)
        {
            Response.Write(assemblyFolder + "<br/>");
        }
    }
}

スタックオーバーフローに関するこの他の回答を参照してください。これを使用して、gac を正常に列挙しました。

于 2012-07-26T03:21:05.517 に答える