Accéder à une DLL .NET personnalisée dans VBScript
-
19-08-2019 - |
Question
J'ai écrit une DLL dans .NET et je veux y accéder dans VBScript. Je ne veux pas l'ajouter au répertoire de l'assembly.
Existe-t-il un moyen de pointer également la DLL et de créer une instance de celle-ci?
La solution
Vous pouvez enregistrer cette dll .NET avec utilitaire regasm par spécifiant le paramètre / codebase
. Ce paramètre n’est pas recommandé pour les assemblys non signés, mais fonctionne lorsque vous ne pouvez pas placer votre assemblage dans GAC.
regasm your.dll /codebase
Veuillez noter que vous ne devez pas changer le chemin de votre fichier .dll après cette opération, car ce chemin est inséré dans le registre Windows.
Autres conseils
Je devais le faire moi-même, mes conclusions étaient:
Rendre les types visibles à COM:
- Assurez-vous que votre classe est publique, non statique et qu’elle possède un constructeur par défaut public, c’est-à-dire sans arguments.
- Assurez-vous que votre méthode est publique et non statique.
-
Assurez-vous que l'ensemble suivant est défini sur votre assemblage - généralement dans AssemblyInfo.cs
[assembly: ComVisible(true)]
-
Après avoir créé votre DLL, à partir de la ligne de commande du SDK, exécutez la commande suivante:
regasm yourdll.dll
Ceci devrait répondre:
Types enregistrés avec succès
Si vous obtenez
RegAsm: avertissement RA0000: aucun type n'a été enregistré
alors vous devez définir
ComVisible
ou ne pas avoir de types publics non statiques.
À partir de PowerShell
$a = New-Object -comobject Your.Utils.Logging
$a.WriteError2("Application", "hello",1,1)
À partir de vbs
Set logger = CreateObject("Your.Utils.Logging")
logger.WriteError2 "Application", "hello from vbs",1,1
// bind a variabe to WScript.Shell
Set WshShell = CreateObject("WScript.Shell")
// define the path to the regasm.exe file
RegAsmPath = "c:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe"
// register the dll
WshShell.run "cmd /c " & RegAsmPath & " c:\temp\cbsecurity.dll /codebase /nologo /s", 0, True
// bind a variable to the dll
Set cbUtil = CreateObject("CBSecurity.Utilities")
J'avais inclus une méthode IsAlive dans la dll ...
Public Function IsAlive() As Boolean
Return True
End Function
... et peut vérifier qu'il est correctement enregistré en utilisant la syntaxe suivante:
//check if dll is available to your code
msgbox "cbUtil is alive: " & cbUtil.IsAlive
J'espère que cela aide quelqu'un ...
Dans le cas où quelqu'un aurait besoin de déboguer / step-dans la DLL .Net appelée à partir de VBScript uniquement:
-
Dans l'écran de configuration du débogage du projet .Net dll, définissez le "programme externe de démarrage" " en naviguant jusqu'au programme wscript.exe (situé dans C: \ WINDOWS \ system32 \ wscript.exe).
-
Sur les "Arguments de la ligne de commande", définissez le nom du fichier et l'emplacement du chemin d'accès au fichier VBScript (C: \ Test \ myTest.vbs). Assurez-vous que le fichier vbs et le fichier dll se trouvent au même emplacement.
-
Enfin, dans le code source de la DLL de projet .Net, définissez simplement le point de rupture et cliquez sur le bouton "démarrer le débogage"
Pas directement. Vous aurez besoin d’un wrapper COM appelable dans n’importe quelle bibliothèque .NET que vous appelez depuis COM (et donc avec VBScript). Par conséquent, vous devez créer directement un CCW dans la DLL ou créer un CCW pour une DLL proxy qui fournit des méthodes génériques pour charger une DLL .NET et vous fournit des méthodes qui appellent les méthodes réelles du composant et renvoient le résultat. Ce n'est vraiment pas propre du tout. Donc, en général, la réponse est non.