我在 .NET 中编写了一个 DLL,我想在 VBScript 中访问它。我不想将它添加到程序集目录中。
有没有办法指向 DLL 并创建它的实例?
我在 .NET 中编写了一个 DLL,我想在 VBScript 中访问它。我不想将它添加到程序集目录中。
有没有办法指向 DLL 并创建它的实例?
我只需要自己做,我的发现是:
使类型对 COM 可见:
确保您的程序集具有以下设置 - 通常在 AssemblyInfo.cs 中
[assembly: ComVisible(true)]
构建 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
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
希望这可以帮助某人...
您可以通过指定参数向regasm 实用程序注册该 .NET dll 。/codebase
不鼓励将此参数与未签名的程序集一起使用,但当您无法将程序集放入 GAC 时它可以工作。
regasm your.dll /codebase
请注意,您不应在此操作后更改 .dll 的路径,因为它会将此路径插入 Windows 注册表。
如果有人需要调试/单步执行仅从 VBScript 调用的 .Net dll:
在 .Net dll 项目调试设置屏幕上,通过浏览到 wscript.exe 程序(位于 C:\WINDOWS\system32\wscript.exe)设置“启动外部程序”。
在“命令行参数”中,设置 VBScript 文件的文件名和路径位置 (C:\Test\myTest.vbs)。确保 vbs 文件和 dll 文件位于同一位置。
最后,在 .Net 项目 DLL 源代码中设置断点并点击“开始调试”
不是直接的。您将需要一个 COM 可调用包装器来连接您将从 COM(以及因此 VBScript)调用的任何 .NET 库。因此,您应该直接为 DLL 创建一个 CCW,或者您可以为代理 DLL 创建一个 CCW,该代理 DLL 提供了加载 .NET DLL 的通用方法,并为您提供了调用组件上的实际方法并返回结果的方法。真的一点都不干净。所以,总的来说,答案是否定的。