2008-12-05 5 views

Antwort

5

Sie können diese .NET-DLL mit regasm utility registrieren, indem Sie /codebase Parameter angeben. Dieser Parameter wird nicht für nicht signierte Assemblys empfohlen, funktioniert jedoch, wenn Sie Ihre Assembly nicht in GAC einfügen können.

regasm your.dll /codebase 

Bitte beachten Sie, dass Sie nicht Ihre DLL-Pfad nach dieser Operation ändern sollte, da es diesen Pfad in der Windows-Registrierung einfügt.

+0

Wie UNREGISTER Sie, wenn Sie es tun? –

+1

regasm your.dll/Registrierung – huseyint

1

Nicht direkt. Sie benötigen einen COM Callable Wrapper für jede .NET-Bibliothek, die Sie von COM aufrufen (und somit VBScript). Daher sollten Sie entweder direkt ein CCW für die DLL erstellen oder Sie können eine CCW für eine Proxy-DLL erstellen, die generische Methoden zum Laden einer .NET-DLL bereitstellt und Methoden für Sie bereitstellt, die die tatsächlichen Methoden der Komponente aufrufen und das Ergebnis zurückgeben. Es ist wirklich nicht sauber. Also, im Allgemeinen ist die Antwort nein.

6

Huseyints Antwort war auf das Geld, aber ich wollte etwas hinzufügen. Hier einige Beispiel-Code, den ich für dieses sehr Problem verwendet, vielleicht kann es Ihnen entlang beschleunigen ...

// 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") 

ich aufgenommen hatte eine IsAlive-Methode in der dll ...

Public Function IsAlive() As Boolean 
    Return True 
End Function 

... und könnte prüfen, ob sie registriert die Syntax richtig mit:

//check if dll is available to your code 
msgbox "cbUtil is alive: " & cbUtil.IsAlive 

Hope this jemand hilft ...

12

I nur hatte dies selbst zu tun, meine Ergebnisse waren:

machen Typen sichtbar COM:

  1. Stellen Sie sicher, Ihre Klasse ist öffentlich, nicht statisch und hat einen öffentlichen Standardkonstruktor das heißt keine Argumente.
  2. Stellen Sie sicher, dass Ihre Methode öffentlich und nicht statisch ist.
  3. Stellen Sie sicher, dass die folgenden Komponenten auf Ihrer Baugruppe festgelegt sind - normalerweise in AssemblyInfo.cs

    [assembly: ComVisible(true)] 
    
  4. nach dem DLL erstellt, von SDK laufen Befehlszeile:

    regasm yourdll.dll 
    

    Dies sollte antworten:

    Typen

    erfolgreich registriert Wenn Sie

    erhalten

    RegAsm: Warnung RA0000: Keine Typen wurden

    registriert

    dann müssen Sie ComVisible oder haben keine öffentlichen, nicht-statische Typen setzen.

Von Powershell

$a = New-Object -comobject Your.Utils.Logging 
$a.WriteError2("Application", "hello",1,1) 

Von vbs

Set logger = CreateObject("Your.Utils.Logging") 
logger.WriteError2 "Application", "hello from vbs",1,1 
+0

Große Antwort, Sie enthalten jeden Schritt. Danke vielmals. – lidermin

+0

Danke, das hilft einem Haufen. Schritt 3 war derjenige, den ich vermisste! – mlsteeves

+0

@ foolshat .. Ist das Server.CreateObject oder CreateObject – Vani

4

Falls jemand braucht/Schritt-in debuggen .Net-DLL, die nur von VBScript aufgerufen wird:

  1. Legen Sie auf dem Debug-Setup-Bildschirm des .Net-Dll-Projekts das "externe Programm starten" fest, indem Sie zum Programm wscript.exe (in C: \ WINDOWS \ system32 \ wscript.exe) navigieren.

  2. Legen Sie in den "Befehlszeilenargumenten" den Dateinamen und den Pfad der VBScript-Datei (C: \ Test \ myTest.vbs) fest. Stellen Sie sicher, dass sich die VBS-Datei und die DLL-Datei am selben Speicherort befinden.

  3. Schließlich wird in der .NET-Projekt Code DLL Quelle nur den Bruchpunkt gesetzt und drücken Sie die "start debug"

Verwandte Themen