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?

Foi útil?

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:

  1. Certifique-se de sua classe é pública, não-estático e tem um público padrão construtor ou seja, não argumentos.
  2. Verifique se o seu método é público, não-estático.
  3. Verifique se você tem o seguinte conjunto no seu conjunto - normalmente em AssemblyInfo.cs

    [assembly: ComVisible(true)]
    
  4. 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:

  1. 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)

  2. 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.

  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top