【发布时间】:2017-09-15 05:56:53
【问题描述】:
我们有一个 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
【问题讨论】:
-
这不是问题,但问题中缺少关键信息。您的用户没有单击“注册 COM 互操作”复选框。你必须解释这个组件是如何在用户的机器上注册的。如果您为其创建了安装程序,则它必须是 64 位安装程序。如果他们使用 Regasm.exe,那么他们必须使用 64 位版本。
-
@HansPassant,我们的用户确实使用 regasm。我刚刚将此命令行调用添加到问题中。
-
我想您的用户足够精明,可以从不完整的安装说明中找出答案,但他们不知道要使用四个 Regasm.exe 版本中的哪一个,这并不奇怪。你为什么不自己尝试一下,你很快就会发现它有什么问题。
-
@HansPassant,感谢您针对不同架构提供不同版本的 regasm 的提示。
标签: vb.net com 64-bit ms-office winforms-interop