枚举所有已安装的组件的版本(在GAC)(Enumerate all installed versio

2019-09-18 04:01发布

是否有可能枚举GAC使用C#程序集的所有已安装的版本? 例如,我有一个名为“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。

Answer 1:

使用托管包装的非托管融合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

感谢汉斯帕桑特谁向我指出了正确的方向!



文章来源: Enumerate all installed versions of an assembly (in GAC)
标签: c# dll x86 64-bit gac