C#:在 GAC 中查找 PresentationCore.dll(和其他程序集)的路径

Posted

技术标签:

【中文标题】C#:在 GAC 中查找 PresentationCore.dll(和其他程序集)的路径【英文标题】:C#: finding path to PresentationCore.dll (and other assemblies) in the GAC 【发布时间】:2019-02-20 03:28:53 【问题描述】:

我需要通过调用ReferencedAssemblies.Add 来引用CSharpCodeProvider 中的各种程序集。

对于某些程序集,只需传递程序集名称就足够了 - 例如ReferencedAssemblies.Add("System.dll")

但是,PresentationCore.dll 是需要完整路径的程序集之一 - 我可能在目标计算机上不一定知道。

问题:

我如何找到(最新的?)相应程序集的最终路径 - 例如,在 GAC 中?

理想情况下,该解决方案不仅适用于PresentationCore.dll,还适用于其他程序集,例如PresentationFramework.dllSystem.Xaml.dllSystem.Windows.Forms

未产生预期结果的来源:

This solution 将涉及对特定路径进行硬编码,但解决方案应该是动态的 实施this Windows API 可能有效;但我不知道如何 - 或者它是否有助于解决上述问题 This C++ 问题是指 GAC 的位置,而不是如何获取实际文件路径

【问题讨论】:

是否可以在应该进行解析的程序中引用这些程序集?然后你可以typeof([TypeKnownToBeInTheDesiredAssembly]).Assembly.CodeBase 并使用:***.com/a/283917/4035472 处理结果。 @thehennyy 这完美无瑕 - 非常感谢。如果你能把它变成一个答案,我就能把它标记为已接受。 【参考方案1】:

您可以在应该进行解析的代码中引用程序集。然后运行时会告诉你组装位置:

typeof([TypeKnownToBeInTheDesiredAssembly]).Assembly.CodeBase

例如,查找 System.Xml.dll:

string codeBase = typeof(System.Xml.XmlDocument).Assembly.CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
Console.WriteLine(path);

[ref]

在我的系统上:

C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

【讨论】:

Assembly.Location 不是比Assembly.CodeBase 更好的选择吗? Assembly.Location 是一个好点,但我在过去遇到了麻烦。也许同时考虑这两个属性

以上是关于C#:在 GAC 中查找 PresentationCore.dll(和其他程序集)的路径的主要内容,如果未能解决你的问题,请参考以下文章

COM 注册和 GAC

将 DLL 安装到全局程序集缓存(GAC)

C# 注册DLL至GAC 并在添加引用中使用该DLL

C# - 从另一个 AppDomain 中的方法返回值

为啥办公室 PIA 不能正确安装到 GAC?

C# MySql 连接器/网络问题