.NET托管等效的COM组件类别?

时间:2013-02-11 18:31:03

标签: .net plugins components

.NET是否具有注册相关对象的规范机制? (即.NET的组件类别?)

背景

如果你有一堆COM对象,它们都是相关的,并且都实现了相同的接口,并且想要一个中心位置来注册所有这些对象,你可以使用组件类别

HKCR\Component Categories

可以注册一堆相关COM对象的地方。如果我的软件支持插件,我会创建一个"类别" ,例如:

HKCR\Component Categories\{1628B80E-E735-481C-8EDA-FC13D92B5F36}
   409: REG_SZ = "Ian's super-cool application plugins"

然后,任何想要在我的应用程序中注册其插件的人都必须提及他们通过创建名为已实施类别的条目来实施该类别:

HKCR\{EC05174F-F824-4888-9FDC-EE33080917DE}
   \ProgID
       default = "Stackoverflow.IansSuperCoolApp.1"
   \Implemented Categories
       \{1628B80E-E735-481C-8EDA-FC13D92B5F36}

现在我知道在哪里可以找到它们。例如,Microsoft在类别{C501EDBE-9E70-11D1-9053-00C04FD9189D}下注册了几十个图像变换过滤器:

  • DXImageTransform.Microsoft.CrBlinds.1
  • DXImageTransform.Microsoft.Iris.1
  • DXImageTransform.Microsoft.AlphaImageLoader.1
  • DXImageTransform.Microsoft.RadialWipe.1
  • ...

还有shell扩展,SQL Server冲突解析器;任何时候你需要一种方法来找到你想要的所有课程。

只需一个实现

现在,关于Component Categories没有特殊,除了它是注册相关COM对象的规范位置。每个人都可以自由地创建自己的注册类方式。但发明COM的人决定创建" 这样做的地方。 Microsoft甚至提供an API to help using it

但是没有什么能阻止我声明我自己的机制来注册包含我想要的功能的类:

  • 我可以创建自己的HKCR\Ian's Supercool Application plugins
  • 我可以有一个声明ProgIDs
  • 的XML文件

如果您要在群组中注册COM对象,为什么不使用为您设计的任务地点。

但是.NET呢?

如果我有几十个.NET程序集(* .dll)会发生什么?我应该怎么做才能注册那些?我无法真正使用COM组件类别,因为它们不是COM对象(即它们不是COM对象或COM可调用包装器);它们是托管组件。

.NET中是否存在规范机制来注册程序集类别?

注意:您可以在第一行之后停止阅读所有内容;其余的只是绒毛。

2 个答案:

答案 0 :(得分:0)

如果我正确地阅读你的问题,那么答案是.NET应该是与COM对象不同的野兽。如果COM对象的存储是导致我们进入DLL Hell that .NET was designed to eliminate的一部分,那么您正在讨论的中心位置机制。这是应该避免的,而不是重复的。

那就是.NET you can add items to the Global Assembly Cache。这样做的准则包括 将您的代码分组到名称空间中,只是有意义 。 Microsoft在http://msdn.microsoft.com/en-us/library/vstudio/ms229042(v=vs.100).aspx为此提供了相关指导。 组织代码库的规范方法。

从告诉您如何使用GAC的文章:

  

建议您仅将GAC用于您自己的程序集   什么时候绝对必要。微软建议你应该这样做   通常将您的程序集保留在应用程序文件夹中。

然而,最好的办法是 使用全局程序集缓存,只需将.dll文件复制到应用程序中即可。这有助于避免在.NET之前成为微软平台开发人员祸害的DLL Hell情况。

答案 1 :(得分:0)

问题的目的是创建插件。

由于.NET无法注册dll,因此最好的方法是遵循this answer,您可以在其中加载所有可以找到的DLL。迭代程序集中的所有类型,寻找有趣的类型。

在.NET 3.5中,Microsoft将此技术形式化为一个极其复杂的System.Addins命名空间。