Domanda

Ho scritto una DLL in .NET e desidero accedervi in ??VBScript. Non voglio aggiungerlo alla directory dell'assembly.

C'è un modo per puntare anche la DLL e crearne un'istanza?

È stato utile?

Soluzione

Puoi registrare quella DLL .NET con utility regasm di specificando il parametro / codebase . Questo parametro non è consigliato per l'uso con assembly non firmati ma funziona quando non è possibile inserire l'assembly in GAC.

regasm your.dll /codebase

Si noti che non è necessario modificare il percorso .dll dopo questa operazione poiché inserisce questo percorso nel registro di Windows.

Altri suggerimenti

Ho dovuto farlo da solo, i miei risultati sono stati:

Rendere i tipi visibili a COM:

  1. Assicurati che la tua classe sia pubblica, non statica e abbia un costruttore predefinito pubblico, cioè non argomenti.
  2. Assicurati che il tuo metodo sia pubblico, non statico.
  3. Assicurati di avere il seguente set nel tuo assembly, in genere in AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. Dopo aver creato la DLL, dalla riga di comando SDK eseguire:

    regasm yourdll.dll
    

    Questo dovrebbe rispondere:

      

    Tipi registrati correttamente

    Se ricevi

      

    RegAsm: avviso RA0000: nessun tipo registrato

    quindi devi impostare ComVisible o non avere tipi pubblici, non statici.

Da PowerShell

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

Da vbs

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

La risposta di huseyint era sui soldi, tuttavia, volevo aggiungerne un po '. Ecco un po 'di codice di esempio che ho usato proprio per questo problema, forse ti può velocizzare ...

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

Avevo incluso un metodo IsAlive nella dll ...

Public Function IsAlive() As Boolean
    Return True
End Function

... e potrebbe verificare che sia stato registrato correttamente utilizzando la sintassi:

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

Spero che questo aiuti qualcuno ...

Nel caso in cui qualcuno debba eseguire il debug / accedere alla dll .Net chiamata solo da VBScript:

  1. Nella schermata di configurazione del debug del progetto dll .Net, impostare "quot programma esterno" passando al programma wscript.exe (situato in C: \ WINDOWS \ system32 \ wscript.exe).

  2. In " Argomenti della riga di comando " ;, imposta il nome del file e il percorso del file VBScript (C: \ Test \ myTest.vbs). Assicurarsi che il file vbs e il file dll siano nella stessa posizione.

  3. Infine, nel codice sorgente della DLL del progetto .Net basta impostare il punto di interruzione e premere il pulsante " start debug "

Non direttamente. Avrai bisogno di un wrapper di chiamata COM per qualsiasi libreria .NET che chiamerai da COM (e quindi, VBScript). Pertanto, è necessario creare direttamente un CCW nella DLL oppure è possibile creare un CCW per una DLL proxy che fornisce metodi generici per caricare una DLL .NET e fornire metodi che chiamano i metodi effettivi sul componente e restituiscono il risultato. Non è affatto pulito. Quindi, in generale, la risposta è no.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top