1

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

背景

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

HKCR\Component Categories

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

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

然后任何想要在我的应用程序中注册他们的插件的人都只需要提到他们通过创建一个名为Implemented Categories的条目来实现该类别:

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

现在我知道在哪里可以找到它们。例如,微软有几十个图像转换过滤器,它们都注册在 category 下{C501EDBE-9E70-11D1-9053-00C04FD9189D}

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

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

只有一种实现

现在,除了它是注册相关 COM 对象的规范位置之外,没有什么特别之处。Component Categories每个人都可以自由创建自己的课程注册方式。但是发明 COM 的人决定创建“这个”地方来做它。微软甚至提供了一个 API 来帮助使用它

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

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

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

但是.NET 呢?

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

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

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

4

2 回答 2

0

问题的目的是创建插件。

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

在 .NET 3.5 中,Microsoft 将这种技术形式化为一个非常复杂的System.Addins命名空间。

于 2013-12-21T22:55:53.020 回答
0

如果我没看错你的问题,那么答案是 .NET 与 COM 对象不同。如果 COM 对象的存储是导致我们进入.NET 旨在消除. 这是要避免的事情,而不是重复的事情。

也就是说,在.NET 中,您可以将项目添加到 Global Assembly Cache。并且这样做的指导方针包括将您的代码分组到简单有意义的命名空间中Microsoft 在http://msdn.microsoft.com/en-us/library/vstudio/ms229042(v=vs.100).aspx上为此提供了指导。这组织代码库的规范方式。

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

建议您仅在绝对必要时将 GAC 用于您自己的程序集。Microsoft 建议您通常应将程序集保存在应用程序文件夹中。

然而,通常情况下,最好的选择是使用全局程序集缓存,而只是将您的 .dll 文件复制到应用程序中。这有助于避免 DLL Hell 情况,这是 .NET 之前 Microsoft 平台开发人员的祸根。

于 2013-02-11T19:09:49.790 回答