Pregunta

Escribí una DLL en .NET y quiero acceder a ella en VBScript. No quiero agregarlo al directorio de ensamblaje.

¿Hay alguna manera de señalar también la DLL y crear una instancia de ella?

¿Fue útil?

Solución

Puede registrar ese .NET dll con utilidad de regasm por especificando el parámetro / codebase . No se recomienda usar este parámetro con ensamblajes sin firmar, pero funciona cuando no puede colocar su ensamblaje en GAC.

regasm your.dll /codebase

Tenga en cuenta que no debe cambiar la ruta de su .dll después de esta operación, ya que inserta esta ruta en el registro de Windows.

Otros consejos

Solo tenía que hacer esto yo mismo, mis hallazgos fueron:

Hacer que los tipos sean visibles para COM:

  1. Asegúrese de que su clase sea pública, no estática y tenga un constructor público predeterminado, es decir, no argumentos.
  2. Asegúrese de que su método sea público, no estático.
  3. Asegúrese de tener el siguiente conjunto en su ensamblaje, generalmente en AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. Después de construir su DLL, desde la línea de comando del SDK ejecute:

    regasm yourdll.dll
    

    Esto debería responder:

      

    Tipos registrados con éxito

    Si obtienes

      

    RegAsm: advertencia RA0000: no se registraron tipos

    entonces necesita configurar ComVisible o no tener tipos públicos, no estáticos.

De PowerShell

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

De vbs

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

huseyint fue sobre el dinero, sin embargo, quería agregarle un poco. Aquí hay un código de muestra que utilicé para este mismo problema, tal vez pueda acelerarlo ...

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

Había incluido un método IsAlive en el dll ...

Public Function IsAlive() As Boolean
    Return True
End Function

... y podría comprobar que se registró correctamente utilizando la sintaxis:

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

Espero que esto ayude a alguien ...

En caso de que alguien necesite depurar / ingresar al .Net dll que se llama solo desde VBScript:

  1. En la pantalla de configuración de depuración del proyecto .Net dll, configure el "iniciar programa externo" navegando al programa wscript.exe (ubicado en C: \ WINDOWS \ system32 \ wscript.exe).

  2. En los " Argumentos de línea de comando " ;, establezca el nombre del archivo y la ubicación de la ruta del archivo VBScript (C: \ Test \ myTest.vbs). Asegúrese de que el archivo vbs y el archivo dll estén en la misma ubicación.

  3. Finalmente, en el código fuente del DLL del proyecto .Net solo establezca el punto de interrupción y presione el botón "iniciar depuración"

No directamente. Necesitará un Contenedor invocable COM para cualquier biblioteca .NET a la que llame desde COM (y, por lo tanto, VBScript). Por lo tanto, debe crear directamente una CCW en la DLL o puede crear una CCW para una DLL proxy que proporcione métodos genéricos para cargar una DLL .NET y proporcione métodos que llamen a los métodos reales en el componente y devuelvan el resultado. Realmente no está limpio en absoluto. Entonces, en general, la respuesta es no.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top