Доступ к пользовательской .NET DLL в VBScript - PullRequest
6 голосов
/ 06 декабря 2008

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

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

Ответы [ 5 ]

12 голосов
/ 19 мая 2009

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

Создание типов, видимых для 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 
6 голосов
/ 07 февраля 2009

Ответ 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")

Я включил метод 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

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

5 голосов
/ 06 декабря 2008

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

regasm your.dll /codebase

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

4 голосов
/ 24 августа 2010

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

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

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

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

1 голос
/ 06 декабря 2008

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

...