【发布时间】:2012-06-15 12:49:06
【问题描述】:
是否可以使用 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 进行编译。
【问题讨论】:
-
您可以使用 Fusion api、CreateAssemblyEnum() 和 IAssemblyEnum + IAssemblyName 执行此操作。这未在 .NET 框架中公开,但它确实包含它的代码。 ILSpy 或 Reflector 会很方便。
-
@HansPassant Fusions 似乎正是我想要的。不过好像很难用。如果有对这种东西的托管/内置支持会很好。非常感谢!