命令“gacutil”仅列出全名,而没有任何关于实际位置的线索。我知道位置从这些路径开始:
C:\WINDOWS\assembly\...
C:\WINDOWS\Microsoft.Net\...
但是这些路径存储了许多其他程序集,而不仅仅是GAC中的程序集。我通过调用Assembly.Load(FullName)
或Assembly.ReflectionOnlyLoad(FullName)
来使用一些C#代码来获取包含位置的对象Assembly,但是它们将FullName
中的版本更改为与当前运行时兼容的另一个版本,例如为target NET Framework 4.5.2
编译代码时,如果它试图加载mscorlib, Version=2.0.0.0
然后它获取mscorlib, Version=4.0.0.0
而不是
您可以使用COM枚举汇编缓存(CreateAssemblyEnum
→IAssemblyEnum
,CreateAssemblyCache
→IAssemblyCache
,GetNextAssembly
→GetAssemblyName
→QueryAssemblyInfo
)。
QueryAssemblyInfo
返回ASSEMBLY_INFO
,其中包括组装路径(pszCurrentAssemblyPathBuf
)。
在Junfeng Zhang's MSDN blog about Sample Managed GAC API Wrappers中有一些使用这些函数的例子