如何使用 C# 获取已注册的 .NET 组件的位置?

Posted

技术标签:

【中文标题】如何使用 C# 获取已注册的 .NET 组件的位置?【英文标题】:How do I get the location of a registered .NET component using C#? 【发布时间】:2011-07-31 06:18:08 【问题描述】:

在 Visual Studio 中,您可以引用已注册的 .NET 组件。我需要在运行时获取这些组件之一的位置(完整路径)。我可以实现(在 C# 中)吗?

我没有在我的项目中引用那个 .NET 程序集。我只想获取已注册的 .NET 程序集的位置,就像它在窗口中列出的那样,当我想添加引用时会显示它。

【问题讨论】:

您是在说工具箱中的项目,添加参考对话框等...? 您是在询问 GAC 中程序集的路径吗? 【参考方案1】:

你想做什么?

如果您想在运行时确定程序集的路径,请尝试以下操作:

Assembly.GetAssembly(typeof(Form)).Location
// Output:
// C:\WINDOWS\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll

您应该将“Form”替换为您希望为 mscorlib.dll 定位的程序集中的类型(例如 string)。

【讨论】:

这将返回 GAC 路径,而不是程序集的原始位置 @Farzin “程序集的原始位置”是什么意思?如果程序集是从 GAC 加载的,那么这就是将返回的路径。 但是在 GAC 中注册的主程序集位置不同。要找到真正的路径,他应该阅读注册表。 @Farzin “真实”路径是什么意思?如果程序集是从 GAC 加载的,那么还有什么路径比实际加载程序集的路径更“真实”? @iDog 最简单的方法可能是加载程序集并使用加载程序集的位置。如果这不起作用,那么此链接How to: Add or Remove References in Visual Studio (MSDN) 可能有助于通过查看注册表来识别出现在参考列表中的第 3 方组件。【参考方案2】:
Assembly.GetAssembly([C#_Component].GetType()).Location

【讨论】:

这将返回 GAC 路径,而不是程序集的原始位置 @Farzin 如果从 GAC 加载...在运行时没有其他位置 我没有引用那个 .NET 组件,所以我不能使用“GetType”。必须有一种方法可以在不引用该 Dll 的情况下获取位置?! 啊,Google for Fusion API for COM,它有你需要的工具【参考方案3】:

在 HKEY_CLASSES_ROOT\CLSID 下搜索您的 EXE 文件的名称。它应该用作“LocalServer32”的值。

您只需要为此阅读注册表。

参考:堆栈溢出问题How to get an ActiveX component's registered path

【讨论】:

这仅适用于 COM 对象 - 并非所有 .Net 程序集都公开 COM 对象,因此很多不会出现在此列表中。 +1,这个问题太糟糕了,不能准确回答

以上是关于如何使用 C# 获取已注册的 .NET 组件的位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在.net core 2 c#中获取地理位置

c#编程,添加引用时,COM和.NET有啥区别?代表啥意思

电脑管家(像qq,360管家)是怎么获取到系统中安装的软件列表和补丁列表(漏洞,已安装,未安装)用C#如何实现

如何在 c# 中使用统一组合网格并获取相对于主父级的点击位置

如何在 .NET (C#) 中使用 AutoItX 而无需注册

如何从 C# 等托管代码中为 ActiveX 组件使用嵌入式免注册清单?