Créer un vrai Ocx en DotNet

www.vbfrance.com/code.aspx?id=50939

Documentation : OcxDotNet.html

Par Patrice Dargenton : patrice.dargenton@free.fr

http://patrice.dargenton.free.fr/CodesSources/index.html

Version 1.01 du 06/12/2009

 

A ma connaissance, il n'est pas possible de créer un vrai Ocx directement en DotNet : j'entends par "vrai" Ocx un contrôle ActiveX que l'on peut insérer partout, exactement comme ceux que l'on faisait par exemple en VB6. Par contre on peut créer une dll ActiveX en DotNet, qui ne pose pas de difficulté à être intégrée dans un projet VB6, mais guère plus : elle n'a pas d'interface utilisateur, et ne peut donc pas s'insérer dans l'ensemble des conteneurs ActiveX, qui sont innombrables. La solution est donc là : il suffit de faire un Ocx en VB6 qui utilise notre dll ActiveX en DotNet, c'est tout !

 

Voici les étapes pour y arriver sans problèmes :

 

Table des matières

Utiliser le modèle "Classe COM" (template) pour VB 2008. 1

Adapter votre projet pour en faire une dll ActiveX en DotNet 1

Créer en VB6 un Ocx utilisant la dll ActiveX en DotNet 2

Utiliser l'Ocx en VB6 : ClientVB6. 3

Conclusion. 3

Liens. 3

 

Mots clés : Ocx, DotNet, VB6, Dll, ActiveX, Com, snk, GAC, Signature.

 

Utiliser le modèle "Classe COM" (template) pour VB 2008

Il ne fait pas grand chose, mais permet de fabriquer des identifiants uniques (qu'il serait hasardeux de faire à la main, pour des questions d'unicité lorsque l'on distribue le composant sur toute la planète !).

Le modèle "Classe COM" n'est pas installé par défaut avec Visual Basic 2008 Express, mais il est téléchargeable ici (cf. vbfusion05.exe, il est déjà inclus dans le zip OcxDotNet) :

www.microsoft.com/france/msdn/vbasic/Appel-DotNET-Framework-a-partir-d-applications-Visual-Basic-6.mspx

Copier le fichier \ModeleActiveX_VB2008\ComClass.zip

dans le dossier : \Mes documents\Visual Studio 2008\Templates\ItemTemplates\Visual Basic\

Ensuite il suffit d'ajouter une classe de type "Classe COM" à votre projet pour récupérer les identifiants et la structure du code source (on peut ensuite supprimer cette classe).

 

Adapter votre projet pour en faire une dll ActiveX en DotNet

En regardant en détail le code source de la classe ComClass1.vb , vous avez le minimum des actions à faire pour transformer votre projet en dll ActiveX : il suffit alors d'ajouter des propriétés et fonctions publiques pour pouvoir les appeler de l'extérieur.

 

Exemple :

 

Public Function NomPrenom() As String

    Dim s1$ = Me.Nom & ", " & Me.Prenom

    Return s1

End Function

 

Si on ne veut pas exposer une fonction publique via Com, on peut la masquer via un attribut :

 

<Runtime.InteropServices.ComVisible(False)> _

Public Sub MaFonctionPupliqueMasquee()

 

Dans AssemblyInfo.vb, il faut trois conditions : AssemblyFileVersion doit être renseigné, ComVisible doit être à True (ou sinon il doit y avoir au moins une fonction publique exposée à Com via l'attribut ComVisible), et le Guid doit être renseigné :

 

<Assembly: AssemblyFileVersion("1.0.0.0")>

<Assembly: ComVisible(True)>

<Assembly: Guid("696142b9-907e-45a5-89df-e4bd29778d9f")> (exemple de Guid)

 

Créer en VB6 un Ocx utilisant la dll ActiveX en DotNet

Pour pouvoir référencer la dll ActiveX en VB6, il faut la mettre dans le GAC. Pour cela, elle doit donc être signée : en VB 2008, il suffit simplement de cliquer sur l'onglet Signature du projet DllActiveXDotNet, et de créer une nouvelle signature, c'est tout.

 

Le projet client _WindowsApplication1 en DotNet à pour but de tester la dll ActiveX, avec l'avantage du mode debug : si cela ne fonctionne plus après avoir modifié la dll, il suffit de recréer une nouvelle signature (et ne pas oublier non plus de définir comme projet de démarrage ce projet client et non la dll : la 1ère fois que l'on ouvre la solution, le projet de démarrage par défaut est erronément défini sur la dll et l'exécution plante systématiquement ; autre symptôme rencontré : aucun point d'arrêt ne peut plus être atteint : c'est un peu le revers de la médaille d'une dll ActiveX).

 

Une fois la dll signée et copiée dans le répertoire \VB6OCX, on peut lancer GAC.bat qui va se charger d'enregistrer la dll ActiveX dans le GAC, et de faire une tlb (Type LiBrary : librairie de type) : c'est cette tlb qu'il faut référencer dans le nouveau projet VB6 de type "Contrôle ActiveX". Le code source de cet Ocx est très simple :

 

Option Explicit

 

Dim pers As New DllActiveXDotNet.Personne

 

Public Property Get strPrenom$()

    strPrenom = pers.Prenom

End Property

 

Public Property Let strPrenom(ByVal sVal$)

    pers.Prenom = sVal

End Property

 

Public Property Get strNom$()

    strNom = pers.Nom

End Property

 

Public Property Let strNom(ByVal sVal$)

    pers.Nom = sVal

End Property

 

Public Property Get strNomPrenom$()

    strNomPrenom = pers.NomPrenom()

End Property

 

Private Sub cmdTest_Click()

 

    If pers.Prenom = "" Then pers.Prenom = "Patrice"

    If pers.Nom = "" Then pers.Nom = "Dargenton"

   

    MsgBox "Prénom : " & pers.Prenom & ", Nom : " & pers.Nom

    Dim sResult As String

    sResult = pers.NomPrenom()

    MsgBox "Nom & prénom depuis DotNet via ComActiveX : " & sResult

   

End Sub

 

Ici l'interface ne sert que pour tester l'Ocx : pour vérifier que le contrôle ActiveX est bien présent dans la liste des contrôles ActiveX avec interface, et qu'il fonctionne bien directement depuis l'interface. On peut cacher cette interface au profit de l'interface du projet final.

 

Note : pour le fichier GAC.bat j'ai inclus les utilitaires du framework DotNet (2.0.50727) dans le zip pour faciliter l'installation sous Windows XP (le cas échéant, remplacez-les si votre configuration est incompatible, les chemins sont précisés dans le fichier batch).

 

Utiliser l'Ocx en VB6 : ClientVB6

Enfin, pour tester l'Ocx, par exemple dans un projet client VB6, il suffit d'ajouter le composant via le menu Projets : Composant... : puis de sélectionner le composant VB6OcxDotNet ou bien de parcourir le fichier VB6OcxDotNet.ocx, c'est équivalent.

Il suffit ensuite de placer le composant ucVB6OcxDotNet (uc pour UserControl : contrôle utilisateur) sur une feuille VB6. On peut alors tester l'Ocx directement depuis son interface, ou bien alors via le code source :

 

Me.ucVB6OcxDotNet1.strNom = "_Dargenton_"

Me.ucVB6OcxDotNet1.strPrenom = "_Patrice_"

MsgBox "Résultat : " & Me.ucVB6OcxDotNet1.strNomPrenom()

 

Conclusion

Cet exemple est fourni a titre de démonstration : si vous voulez créer votre propre composant Ocx, refaite la procédure en entier, sans réutiliser les identifiants globaux, ni le fichier .snk, de façon à éviter la confusion entre vos développements et les miens, au cas où distribueriez votre composant (pour info. je n'utilise jamais de signature de type snk, et tous mes logiciels DotNet sont fournis avec le code source sur VBFrance, et je ne fait plus de VB6 : on ne peut donc pas me rendre responsable d'un logiciel qui serait soi-disant signé par moi-même. Exception : IAVB.ocx, cf. ci-dessous).

 

Pour un exemple réel d'Ocx en DotNet, voir ici :

Intelligence Artificielle en Visual Basic (IAVB)

www.vbfrance.com/code.aspx?id=1860

 

Mes codes sources sont ici :

http://patrice.dargenton.free.fr/CodesSources/index.html

 

 

Liens

 

OpenXML en VB6 Lire et Ecrire des fichiers .xlsx (via DotNet ActiveX)

  http://bbil.developpez.com/tutoriel/vb/vb6-OpenXML/?page=PreRequis#LII-A

 

- Maîtriser COM+ en C# (Partie 1)

  www.dotnet-project.com/Articles-COM-technologie-application-deploiement.32.aspx

 

- Pour aller plus loin avec les Dll ActiveX en DotNet :

Programming Microsoft Visual Basic 2005: The Language

Francesco Balena - Microsoft Press, 2006

www.dotnet2themax.com/ProgrammingVB2005.aspx

www.dotnet2themax.com/BooksFrancesco.aspx

Chapter 22 : PInvoke and COM Interop : Ce dernier chapitre contient des informations sur : CustomException (gestion des exceptions compatibles HResult pour com), RegisterFunctions (comment enregistrer et désinstaller des clés de registre en même temps que la dll ActiveX) et sur la gestion des événements dans la dll ActiveX.