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
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. –
@HansPassant, nos utilisateurs utilisent regasm. Je viens d'ajouter cet appel de ligne de commande à la question. – TecMan
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. –