如何使用 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 组件的位置?的主要内容,如果未能解决你的问题,请参考以下文章
电脑管家(像qq,360管家)是怎么获取到系统中安装的软件列表和补丁列表(漏洞,已安装,未安装)用C#如何实现
如何在 c# 中使用统一组合网格并获取相对于主父级的点击位置