7

C# を使用して GAC にインストールされているアセンブリのすべてのバージョンを列挙することは可能ですか? たとえば、「My.Assembly」という名前のアセンブリがあります。アセンブリにはさまざまなバージョン (「1.0.0.0」、「2.3.4.5」、「0.1.2.4」など) があり、さまざまなプラットフォーム (x86、x64、任意の CPU) 用にコンパイルされている場合があります。

ここで、どのバージョン/プラットフォームがインストールされているかを判断する方法が必要です。

GAC でディレクトリを列挙できることは承知していますが、それは間違っているようです。これを行うためのより良い方法があるはずです。

背景 ユーザーが DLL を選択するランチャー アプリケーションがあります。ランチャーは、DLL から情報を (ロードせずに) 取得した後、DLL を処理する適切なマネージ C# アプリケーションを起動する必要があります。DLL は Win32 または x64 用にコンパイルされ、常に同じ (プラットフォームに依存しない) インターフェイスを公開します。LoadLibrary 関数を使用して、C# アプリケーションに DLL をロードします。唯一の問題は、プロセスが一致する形式 (x86 または x64) でなければならないことです。C# アプリケーションは、x86、x64、および任意の CPU 用にコンパイルでき、コンパイルする必要があります。

4

1 に答える 1

7

アンマネージドFusion APIのマネージド ラッパーを使用すると、まさに私がやりたかったことを実行できました。

class Program
{

    static IEnumerable<AssemblyName> GetInstalledVersions(string name)
    {
        int result;

        IAssemblyName assemblyName;
        result = Utils.CreateAssemblyNameObject(out assemblyName, name, CreateAssemblyNameObjectFlags.CANOF_DEFAULT, IntPtr.Zero);
        if ((result != 0) || (assemblyName == null))
            throw new Exception("CreateAssemblyNameObject failed.");

        IAssemblyEnum enumerator;
        result = Utils.CreateAssemblyEnum(out enumerator, IntPtr.Zero, assemblyName, AssemblyCacheFlags.GAC, IntPtr.Zero);
        if ((result != 0) || (enumerator == null))
            throw new Exception("CreateAssemblyEnum failed.");

        while ((enumerator.GetNextAssembly(IntPtr.Zero, out assemblyName, 0) == 0) && (assemblyName != null))
        {
            StringBuilder displayName = new StringBuilder(1024);
            int displayNameLength = displayName.Capacity;
            assemblyName.GetDisplayName(displayName, ref displayNameLength, (int)AssemblyNameDisplayFlags.ALL);
            yield return new AssemblyName(displayName.ToString());
        }

    }

    static void Main(string[] args)
    {
        foreach (AssemblyName assemblyName in GetInstalledVersions("System.Data"))
            Console.WriteLine("{0} V{1}, {2}", 
                assemblyName.Name, assemblyName.Version.ToString(), assemblyName.ProcessorArchitecture);
    }
}

上記のプログラムを実行すると、次の出力が得られます。

System.Data V2.0.0.0, Amd64
System.Data V2.0.0.0, X86
System.Data V4.0.0.0, Amd64
System.Data V4.0.0.0, X86

私を正しい方向に向けてくれたHans Passantに感謝します!

于 2012-06-18T07:16:05.167 に答える