是否有可能枚举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。
使用托管包装的非托管融合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
感谢汉斯帕桑特谁向我指出了正确的方向!