我們有一個VB.NET項目,它包含一個WinForms控件和.NET UserControl,並使其作爲一個COM程序集用於Microsoft辦公室。該項目使用標準技術來做到這一點,即我們在項目屬性中設置'Make Assembly COM-Visible'和'Register for COM Interop'複選框,用強名稱等對程序集進行簽名。在註冊表中的組件註冊爲以下幾點:當我們的客戶試圖Microsoft Office的64位版本使用.NET COM包裝在Microsoft Office的64位版本中提供VB.NET UserControl的COM版本
<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
此建設工作沒有任何問題了多年,直到那一刻。我試圖在因特網上找到這個問題的答案,但我找不到指導如何爲WinForms控件實現64位兼容的COM包裝。
有沒有可能?如果是這樣,你能指出我們正確的方向嗎?
更新:目前,我們的用戶與管理員權限來註冊COM包裝推出的命令提示符下使用以下命令:
regasm <full_path_to_dll> /tlb /codebase
這不是問題,但是關鍵信息在問題中缺失。您的用戶未點擊「'註冊COM Interop」複選框。你必須解釋這個組件是如何在用戶機器上註冊的。如果您爲它創建了安裝程序,那麼它必須是64位安裝程序。如果他們使用Regasm.exe,那麼他們必須使用它的64位版本。 –
@HansPassant,我們的用戶確實使用regasm。我剛剛添加了這個命令行調用的問題。 – TecMan
我想你的用戶足夠精明,從不完整的安裝指令中找出它,但他們不知道要使用Regasm.exe的四個版本中哪一個是不令人吃驚的。你爲什麼不自己嘗試一下,你很快就會發現它有什麼問題。 –