Доступ к пользовательской .NET DLL в VBScript

Я написал DLL в .NET и хочу получить к ней доступ в VBScript. Я не хочу добавлять его в каталог сборки.

Есть ли способ указать DLL и создать ее экземпляр?


person Donny V.    schedule 05.12.2008    source источник


Ответы (5)


Вы можете зарегистрировать эту .NET dll с помощью утилиты regasm, указав параметр /codebase . Этот параметр не рекомендуется использовать с неподписанными сборками, но он работает, когда вы не можете поместить свою сборку в GAC.

regasm your.dll /codebase

Обратите внимание, что вы не должны изменять путь к вашей .dll после этой операции, так как он вставляет этот путь в реестр Windows.

person huseyint    schedule 05.12.2008
comment
Как отменить регистрацию после того, как вы это сделаете? - person Donny V.; 06.12.2008

Я просто должен был сделать это сам, мои выводы были:

Делаем типы видимыми для COM:

  1. Убедитесь, что ваш класс общедоступен, нестатичен и имеет общедоступный конструктор по умолчанию, то есть не аргументы.
  2. Убедитесь, что ваш метод является общедоступным, а не статическим.
  3. Убедитесь, что у вас есть следующий набор в вашей сборке - обычно в AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. #P4#
    regasm yourdll.dll
    
    #P5# <цитата> #P6# #P7# <цитата> #P8# #P9#

Из 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 
person foolshat    schedule 19.05.2009
comment
Отличный ответ, вы включили каждый шаг. Большое спасибо. - person lidermin; 02.07.2010
comment
Спасибо, это очень помогает. Шаг 3 был тем, чего мне не хватало! - person mlsteeves; 05.08.2010
comment
@foolshat .. Это Server.CreateObject или CreateObject - person Vani; 11.08.2011

ответ хусейнта был о деньгах, однако я хотел немного добавить к нему. Вот пример кода, который я использовал для этой самой проблемы, возможно, это ускорит вас...

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

Я включил метод IsAlive в dll...

Public Function IsAlive() As Boolean
    Return True
End Function

... и может проверить правильность регистрации, используя синтаксис:

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

Надеюсь, это поможет кому-то...

person Dscoduc    schedule 07.02.2009

Если кому-то нужно отлаживать/входить в .Net dll, который вызывается только из VBScript:

  1. На экране настройки отладки проекта .Net dll установите «запустить внешнюю программу», перейдя к программе wscript.exe (расположенной в C:\WINDOWS\system32\wscript.exe).

  2. В «Аргументах командной строки» задайте имя файла и путь к файлу VBScript (C:\Test\myTest.vbs). Убедитесь, что файл vbs и файл dll находятся в одном месте.

  3. Наконец, в исходном коде DLL проекта .Net просто установите точку останова и нажмите «начать отладку».

person agent007    schedule 23.08.2010

Не напрямую. Вам понадобится COM Callable Wrapper для любой библиотеки .NET, которую вы будете вызывать из COM (и, следовательно, VBScript). Таким образом, вы должны либо напрямую создать CCW для DLL, либо вы можете создать CCW для прокси-DLL, который предоставляет общие методы для загрузки .NET DLL и предоставляет вам методы, которые вызывают фактические методы компонента и возвращают результат. Это действительно совсем не чисто. Так что в целом ответ - нет.

person mmx    schedule 05.12.2008