2017-04-19 4 views
0

Nous avons un projet VB.NET qui enveloppe un contrôle WinForms avec le .NET UserControl et le rend disponible en tant qu'ensemble COM pour une utilisation dans Microsoft Bureau. Le projet utilise la technique standard pour ce faire, c.-à-d. Que nous cochez les cases «Créer l'assemblage COM-visible» et «Enregistrer pour COM Interop» dans les propriétés du projet, signer l'assemblage avec un nom fort, etc. l'enregistrement des composants dans le registre est la suivante:Rendre la version COM de VB.NET UserControl disponible dans l'édition 64 bits de Microsoft Office

<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 

cette construction a travaillé sans problème pendant des années jusqu'au moment où nos clients ont essayé d'utiliser ce wrapper .NET COM dans une édition 64 bits de Microsoft office. J'ai essayé de trouver une réponse à cette question sur Internet, mais je n'ai pas trouvé de guide pour implémenter un wrapper COM compatible 64 bits pour un contrôle WinForms.

Est-ce possible? Si oui, pouvez-vous nous orienter dans la bonne direction?


MISE À JOUR: Actuellement, nos utilisateurs utilisent la commande suivante dans l'invite de commande lancée avec les droits d'administrateur pour enregistrer l'emballage COM:

regasm <full_path_to_dll> /tlb /codebase 
+0

Ce n'est pas un problème, mais des informations critiques sont manquantes dans la question. Vos utilisateurs ne cliquent pas sur la case à cocher «S'enregistrer pour COM Interop». Vous devez expliquer comment ce composant est enregistré sur la machine de l'utilisateur. Si vous avez créé un programme d'installation, il doit s'agir d'un programme d'installation 64 bits. S'ils utilisent Regasm.exe, ils doivent utiliser la version 64 bits de celui-ci. –

+0

@HansPassant, nos utilisateurs utilisent regasm. Je viens d'ajouter cet appel de ligne de commande à la question. – TecMan

+1

Je suppose que vos utilisateurs sont assez avertis pour le comprendre à partir de l'instruction d'installation incomplète, mais qu'ils ne savent pas laquelle des quatre versions de Regasm.exe à utiliser n'est pas surprenante. Pourquoi ne l'essayez-vous pas vous-même et vous verrez rapidement ce qui ne va pas. –

Répondre

1

Merci à @HansPassant pour aider à trouver la réponse. Pour enregistrer l'encapsuleur COM .NET pour Office 64 bits, nos clients devaient lancer le regasm correspondant à partir du sous-dossier Framework64. La ligne de commande complète ressemble à ceci:

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