使 VB.NET UserControl 的 COM 版本在 64 位版本的 Microsoft Office 中可用

Make COM-version of VB.NET UserControl available in 64-bit edition of Microsoft Office

我们有一个 VB.NET 项目,该项目使用 .NET UserControl 包装 WinForms 控件,并使其作为 COM 程序集在 Microsoft Office 中使用。该项目使用标准技术来执行此操作,即我们在项目属性中设置 'Make Assembly COM-Visible' 和“Register for COM Interop”复选框,使用强名称对程序集进行签名等。与组件注册相关的基本代码在注册表中如下:

<ComRegisterFunction()>
Public Shared Sub RegisterForCOM(ByVal aType As Type)
    Dim strCtrlKey, strVersion As String
    Dim typeLibGUID As Guid
    strCtrlKey = "CLSID\" + aType.GUID.ToString("B")
    Dim key As RegistryKey = Registry.ClassesRoot.OpenSubKey(strCtrlKey, True)
    key.CreateSubKey("Control")
    key.CreateSubKey("Implemented Categories\{40FC6ED4-2438-11CF-A3D8-080036F12502}")
    key.CreateSubKey("MiscStatus").SetValue("", "131457")
    typeLibGUID = Marshal.GetTypeLibGuidForAssembly(aType.Assembly)
    key.CreateSubKey("TypeLib").SetValue("", typeLibGUID.ToString("B"))
    Dim asmVersion As Version = aType.Assembly.GetName().Version
    strVersion = asmVersion.Major.ToString() + "." + asmVersion.Minor.ToString()
    key.CreateSubKey("Version").SetValue("", strVersion)
    key.Close()
End Sub

<ComUnregisterFunction()>
Public Shared Sub UnregisterForCOM(ByVal aType As Type)
    Try
        Registry.ClassesRoot.DeleteSubKeyTree("CLSID\" + aType.GUID.ToString("B"))
    Catch
    End Try
End Sub

在我们的客户尝试在 64 位版本的 Microsoft Office 中使用此 .NET COM 包装器之前,此构造多年来一直没有任何问题。我试图在 Internet 上找到这个问题的答案,但找不到如何为 WinForms 控件实现 64 位兼容 COM 包装器的指南。

有可能吗?如果是这样,您能为我们指出正确的方向吗?


更新:目前我们的用户在以管理员权限启动的命令提示符中使用以下命令来注册 COM 包装器:

regasm <full_path_to_dll> /tlb /codebase

感谢@HansPassant 帮助找到答案。要为 64 位 Office 注册 .NET COM 包装器,我们的客户需要从 Framework64 子文件夹启动相应的 regasm。完整的命令行如下所示:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm <full_path_to_dll> /tlb /codebase