OcxDotNet : Créer un
vrai Ocx en DotNet
https://codes-sources.commentcamarche.net/source/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
Adapter
votre projet pour en faire une dll ActiveX en DotNet
Créer
en VB6 un Ocx utilisant la dll ActiveX en DotNet
Utiliser
l'Ocx en VB6 : ClientVB6
Mots clés : Ocx, DotNet, VB6, Dll, ActiveX, Com, snk, GAC, Signature.
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) :
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).
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)
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
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
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).
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()
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
- 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.