8

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

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

4

5 回答 5

13

我只需要自己做,我的发现是:

使类型对 COM 可见:

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

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

    regasm yourdll.dll
    

    这应该回应:

    类型注册成功

    如果你得到

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

    那么您需要设置ComVisible或没有公共的非静态类型。

从 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 
于 2009-05-19T11:14:47.810 回答
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

希望这可以帮助某人...

于 2009-02-07T16:37:25.680 回答
5

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

regasm your.dll /codebase

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

于 2008-12-05T21:38:43.750 回答
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 源代码中设置断点并点击“开始调试”

于 2010-08-23T20:45:09.533 回答
1

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

于 2008-12-05T21:25:28.053 回答