2017-04-19 248 views
0

我們有一個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 
+0

這不是問題,但是關鍵信息在問題中缺失。您的用戶未點擊「'註冊COM Interop」複選框。你必須解釋這個組件是如何在用戶機器上註冊的。如果您爲它創建了安裝程序,那麼它必須是64位安裝程序。如果他們使用Regasm.exe,那麼他們必須使用它的64位版本。 –

+0

@HansPassant,我們的用戶確實使用regasm。我剛剛添加了這個命令行調用的問題。 – TecMan

+1

我想你的用戶足夠精明,從不完整的安裝指令中找出它,但他們不知道要使用Regasm.exe的四個版本中哪一個是不令人吃驚的。你爲什麼不自己嘗試一下,你很快就會發現它有什麼問題。 –

回答

1

感謝@HansPassant幫助找到答案。要註冊64位Office的.NET COM包裝器,我們的客戶需要從Framework64子文件夾啓動相應的regasm。完整的命令行如下所示:

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