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?

Était-ce utile?

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:

  1. 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.
  2. Assurez-vous que votre méthode est publique et non statique.
  3. Assurez-vous que l'ensemble suivant est défini sur votre assemblage - généralement dans AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. 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 
La réponse de Huseyint était sur l'argent, cependant, je voulais ajouter un peu. Voici un exemple de code que j’ai utilisé pour ce problème, cela vous permettra peut-être de vous accélérer ...

// 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:

  1. 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).

  2. 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.

  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top