C# 无论.Net Framework如何,我们如何从GAC访问二进制文件

C# 无论.Net Framework如何,我们如何从GAC访问二进制文件,c#,.net,gac,C#,.net,Gac,最初,我们正在开发.NETFramework3.5。因此,GAC路径在代码中硬编码为 C:\Windows\assembly\GAC_64\{0}\1.0.0.0__008145f79b9aec14\{0}.dll 后来我们迁移到.NETFramework 4.0。现在,所需的路径应该是 C:\Windows\Microsoft.NET\assembly\GAC_64\{0}\v4.0_1.0.0.0__008145f79b9aec14\{0}.dll 目前这个问题可以通过在我的代码中添加第

最初,我们正在开发.NETFramework3.5。因此,GAC路径在代码中硬编码为

C:\Windows\assembly\GAC_64\{0}\1.0.0.0__008145f79b9aec14\{0}.dll
后来我们迁移到.NETFramework 4.0。现在,所需的路径应该是

C:\Windows\Microsoft.NET\assembly\GAC_64\{0}\v4.0_1.0.0.0__008145f79b9aec14\{0}.dll
目前这个问题可以通过在我的代码中添加第二条路径来解决。但当微软发布下一套框架时,它可能会失败

所以我想知道是否有任何方法可以独立于.NETFramework访问GAC二进制文件


对此的任何评论都会有所帮助。如果您想从GAC加载程序集,谢谢您:

如果在GAC中找到,它将从那里加载


您应该永远不要在任何地方对GAC的路径进行硬编码。它可以随时更改,即使是在service Pack或修补程序之间,这是一个您无法依赖的实现细节。

不要硬编码它们。

我猜您不需要使用程序集在GAC中的路径来加载程序集(这有一个很大的原因),因此您可能必须手动检查二进制文件而不加载它(例如列出可用程序集或检查其元数据)

如果您需要访问GAC而不依赖于路径,那么它将是您的地狱(Windows目录更改,GAC结构不是琐碎的,有效路径取决于环境、程序集类型等)

有一个非托管API可用于此:查找引用。例如,要获取GAC的路径,您可以编写:

GetCachePath(ASM_CACHE_GAC, pPath, MAX_PATH);

您能解释一下是什么促使您采用这种解决方案吗?为什么需要程序集的路径?为什么假设Windows在C:\Windows中?我希望他不需要加载程序集,而只需要检查它(读取元数据,例如,Reflector会这样做?)我的程序集“samplessembly.dll”位于路径中。C:\WINDOWS\Microsoft.NET\assembly\GAC_32\samplessembly\v4.0_1.0.0.0__008145; f79b9aec14在我试图使用assembly.Load的代码中(“samplessembly.dll,版本=1.0.0.0,区域性=中性,PublicKeyToken=008145f79b9aec14”);但这似乎不起作用。这有什么问题吗?我还尝试过从assembly.Load中删除.dll,但仍然不起作用。@ManjunathKMayya启用融合日志,您将看到它尝试了什么,没有尝试什么work@ManjunathKMayya如果像前面一样加载程序集,则可以从中获取Assembly.FullName以检索完全限定名。您可以使用该名称以我上面解释的方式加载程序集。之后,扔掉硬编码的路径。@ManjunathKMayya而且如果它在GAC中,为什么不能简单地添加引用?
GetCachePath(ASM_CACHE_GAC, pPath, MAX_PATH);