Acesse um costume .NET DLL em VBScript
-
19-08-2019 - |
Pergunta
Eu escrevi uma DLL em .NET e eu quero acessá-lo em VBScript. Eu não quero adicioná-lo para o diretório de montagem.
Existe uma maneira de apontar também a DLL e criar uma instância dele?
Solução
Você pode se registrar que o .NET dll com regasm utilitário por especificando parâmetro /codebase
. Este parâmetro não é encorajado a utilização com conjuntos não assinados, mas ele funciona quando você não pode colocar a sua montagem em GAC.
regasm your.dll /codebase
Por favor note que você não deve alterar o trajeto da sua .dll após esta operação, uma vez que insere este caminho para o registro do Windows.
Outras dicas
Eu apenas tive que fazer isso mesmo, meus resultados foram:
Fazendo tipos visíveis para COM:
- Certifique-se de sua classe é pública, não-estático e tem um público padrão construtor ou seja, não argumentos.
- Verifique se o seu método é público, não-estático.
-
Verifique se você tem o seguinte conjunto no seu conjunto - normalmente em AssemblyInfo.cs
[assembly: ComVisible(true)]
-
Depois de construir a sua DLL, do SDK linha de comando executar:
regasm yourdll.dll
Isso deve responder:
Tipos registrado com sucesso
Se você receber
RegAsm: RA0000 aviso: Não foram registradas tipos
então você precisa conjunto
ComVisible
ou não têm públicas, os tipos não-estático.
De PowerShell
$a = New-Object -comobject Your.Utils.Logging
$a.WriteError2("Application", "hello",1,1)
De vbs
Set logger = CreateObject("Your.Utils.Logging")
logger.WriteError2 "Application", "hello from vbs",1,1
A resposta de huseyint foi o dinheiro, no entanto, eu queria adicionar um pouco a ele. Aqui está um código de exemplo que usei para esta questão, talvez ele pode acelerar-lo ao longo ...
// 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")
Eu tinha incluído um método IsAlive na dll ...
Public Function IsAlive() As Boolean
Return True
End Function
... e poderia verificar se registrado corretamente usando a sintaxe:
//check if dll is available to your code
msgbox "cbUtil is alive: " & cbUtil.IsAlive
Espero que isso ajude alguém ...
No caso de alguém precisa de debug / passo na Net DLL que é chamado de VBScript apenas:
-
Na tela de configuração de depuração do .Net dll projeto, defina o "start programa externo" ao navegar para o programa wscript.exe. (Localizado em C: \ WINDOWS \ system32 \ wscript.exe)
-
No "Argumentos de linha de comando", defina o nome do arquivo e localização do caminho do arquivo VBScript (C: \ test \ myTest.vbs). Verifique se o arquivo vbs e dll arquivo estão no mesmo local.
-
Finalmente, no código fonte .Net projeto DLL apenas definir o ponto de quebra e bateu o "start debug"
Não diretamente. Você vai precisar de uma Callable Wrapper COM a qualquer biblioteca .NET você vai chamar de COM (e, portanto, VBScript). Portanto, você deve ou diretamente criar um CCW para a DLL ou você pode criar um CCW para um proxy DLL que fornece métodos genéricos para carregar a DLL .NET e fornecer métodos para você que chamam os métodos reais no componente e retornar o resultado. Não é realmente limpos. Assim, em geral, a resposta é não.