在.NET中创建COM组件 - 是否可以自动注册“已实现的类别”?

时间:2012-06-28 02:41:16

标签: c# .net com

我正在C#中为只支持ActiveX的遗留应用程序创建自定义控件。该控件在其他应用程序中工作正常,但遗留应用程序仅检查名为“控件”的组件类别而不是“.NET类别”,因此它不会显示在可用控件列表中。

如果我进入regedit并手动将“Control”类别的GUID添加到Implemented Categories,如下所示 - 旧版应用程序找到控件并插入它没有问题。

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXX}\Implemented Categories\{40FC6ED4-2438-11CF-A3DB-080036F12502}

我想知道的是 - 在构建期间是否有自动添加此类别的方法?在部署期间,我不希望工程师必须进入注册表并添加此类别。创建注册表补丁是唯一的方法吗?

我正在使用Visual Studio项目来创建用于部署控件的.msi文件。

1 个答案:

答案 0 :(得分:1)

您可以使用ComRegisterFunctionAttribute。它使您可以添加abritrary注册码。

using System;
using Microsoft.Win32;
using System.Runtime.InteropServices;
public class MyClassThatNeedsToRegister
{
   Guid categoryGuid = ...;

   [ComRegisterFunctionAttribute]
   public static void RegisterFunction(Type t)
   {
       RegistryKey key = Registry.ClassesRoot.CreateSubKey(
     "CLSID\\" + t.GUID.ToString("B") + 
     "\\Implemented Categories\\" + categoryGuid.ToString("B");
   }

   [ComUnregisterFunctionAttribute]
   public static void UnregisterFunction(Type t)
   {
      Registry.ClassesRoot.DeleteSubKey( "CLSID\\" + t.GUID.ToString("B") +
       "\\Implemented Categories\\" + categoryGuid.ToString("B"), false);
   }
}