在VBScript中访问自定义.NET DLL

时间:2008-12-05 21:20:31

标签: .net dll vbscript dllregistration

我在.NET中编写了一个DLL,我想在VBScript中访问它。我不想将它添加到汇编目录中。

有没有办法指出DLL并创建它的实例?

5 个答案:

答案 0 :(得分:12)

我必须自己做,我的发现是:

使COM显示类型:

  1. 确保您的类是公共的,非静态的,并且具有公共默认构造函数,即不是参数。
  2. 确保您的方法是公开的,非静态的。
  3. 确保在程序集上具有以下设置 - 通常在AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. 构建DLL后,从SDK命令行运行:

    regasm yourdll.dll
    

    这应该回应:

      

    已成功注册的类型

    如果你得到

      

    RegAsm:警告RA0000:未注册任何类型

    然后您需要设置ComVisible或没有公开的非静态类型。

  5. 来自PowerShell

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

    来自vbs

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

答案 1 :(得分:6)

huseyint的回答是钱,但是,我想补充一点。以下是我用于此问题的一些示例代码,也许它可以加快您的速度......

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

我在dll中包含了一个IsAlive方法......

Public Function IsAlive() As Boolean
    Return True
End Function

...并且可以使用语法检查它是否正确注册:

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

希望这有助于某人...

答案 2 :(得分:5)

您可以通过指定/codebase参数向{d}注册该.NET dll。不鼓励此参数与未签名的程序集一起使用,但是当您无法将程序集放入GAC时,它会起作用。

regasm your.dll /codebase

请注意,在此操作之后,您不应更改.dll的路径,因为它会将此路径插入Windows注册表。

答案 3 :(得分:4)

如果有人需要调试/步入仅从VBScript调用的.Net dll:

  1. 在.Net dll项目调试设置屏幕上,通过浏览到wscript.exe程序(位于C:\ WINDOWS \ system32 \ wscript.exe)设置“启动外部程序”。

  2. 在“命令行参数”中,设置VBScript文件的文件名和路径位置(C:\ Test \ myTest.vbs)。确保vbs文件和dll文件位于同一位置。

  3. 最后,在.Net项目DLL源代码中设置断点并点击“启动调试”

答案 4 :(得分:1)

不直接。你需要一个COM Callable Wrapper到你将从COM调用的任何.NET库(因此,VBScript)。因此,您应该直接为DLL创建CCW,或者您可以为代理DLL创建CCW,它提供加​​载.NET DLL的通用方法,并为您调用组件上的实际方法并返回结果。它真的不干净。所以,一般来说,答案是否定的。