2008-12-05 23 views

Respuesta

5

Puede registrar esa .NET dll con regasm utility especificando el parámetro /codebase. No se recomienda utilizar este parámetro con ensamblajes sin signo pero funciona cuando no puede colocar su ensamblaje en GAC.

regasm your.dll /codebase 

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

+0

¿Cómo anular el registro una vez que lo haces? –

+1

regasm your.dll/unregister – huseyint

1

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

6

La respuesta de huseyint fue sobre el dinero, sin embargo, quería agregarle un poco más. Aquí algunos ejemplos de código que he usado para este mismo tema, tal vez puede acelerar a lo largo de usted ...

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

yo había incluido un método IsAlive en la DLL ...

Public Function IsAlive() As Boolean 
    Return True 
End Function 

... y podría comprobar que se han registrado correctamente utilizando la sintaxis:

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

Espero que esto ayude a alguien ...

12

I Sólo tenía que hacer esto por mí mismo, mis resultados fueron los siguientes:

Haciendo tipos visibles para COM:

  1. Asegúrese de que su clase es pública, no estático y tiene un constructor público predeterminado es decir, no los 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 conjunto, generalmente en AssemblyInfo.cs

    [assembly: ComVisible(true)] 
    
  4. Después de construir el archivo DLL, desde SDK línea de comando de marcha:

    regasm yourdll.dll 
    

    Esto debe responder:

    Tipos registraron correctamente

    Si obtiene

    RegAsm: RA0000 advertencia: No hay tipos se registraron

    entonces usted necesita para establecer ComVisible o no tienen públicos, los tipos no estáticos.

De PowerShell

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

desde VBS

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

Gran respuesta, usted incluyó cada paso. Muchas gracias. – lidermin

+0

Gracias, esto ayuda un montón. ¡El paso 3 era el que me estaba perdiendo! – mlsteeves

+0

@foolshat .. Es este Server.CreateObject o CreateObject – Vani

4

En caso de que alguien tiene que depurar/paso en la DLL .Net que se llama solamente de VBScript:

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

  2. En los "Argumentos de la línea de comandos", 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. Por último, en el código fuente del proyecto DLL .Net acaba de establecer el punto de equilibrio y golpear la "depuración comenzar"

Cuestiones relacionadas