Utilizando uma DLL escrita em CLR ( C# ) com xHB

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Utilizando uma DLL escrita em CLR ( C# ) com xHB

Mensagem por bencz »

Olá :)

Ante-ontem, o nosso amigo, alxsts, me perguntou como é possível utilizar uma DLL escrita em C# com o xhb ou hb, e, então, fiquei de fazer um tutorial para postar aqui no fórum... pois bem, segue o tutorial:

Para esse tutorial, vou utilizar o xhb.com e o Visual Studio 2012.
bom, como funciona o sistema, iremos criar uma dll em C#, e, vamos fazer o registro COM dela no sistema, por isso, precisamos abrir o VS com privilégios de administrador ( apenas para facilitar o nosso trabalho... ), mas, caso vc nao queira abrir o VS com privilegios de administrador, eu também vou mostrar como fazer o registro da DLL :)

Então, para isso, crie um projeto de DLL no VS, e, após criar o projeto, abra as propriedades do projeto e vá em, Build, e marque a opção, Register for COM interop.

Imagem

Após isso, vá em Signing, e marque a opção Sign the Assembly e vá na opção, <New>

Imagem

Na janela que se abrir, apenas digite o nome da Key, e desmarque a opção para proteger com senha.

Pronto, estamos com o nosso projeto configurado, agora, vamos criar o nosso código.
Para tal, teremos que passar algumas informações para o compilador, como por exemplo, o GUID da classe, o GUID, é possivel ser gerado, utilizando uma ferramenta do VS, que se localiza em: Tools->Create GUID
Após abrirmos essa ferramenta, va na opção de numero 5, e gere um GUID:

Imagem

Faça uma copia do GUID ali escrito, e, vamos escrever o nosso código agora :)

Acima da declaração da classe, escreva o seguinte código:

Código: Selecionar todos

    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("DotNetFunctionsToPrg.ola")]
    [ComVisible(true)]
    [Guid("442CE27F-DA28-46FD-9074-60586C308299")]
repare no GUID, utilizei o GUID que o programa gerou para mim...

e agora, vamos escrever um metodo bem simples, apenas para brincarmos :)

Código: Selecionar todos

        public string ola(string oi, string mundo)
        {
            return string.Format("{0}, {1}", oi, mundo);
        }
Segue código completo da lib em C#

Código: Selecionar todos

using System;
using System.Runtime.InteropServices;

namespace DotNetFunctionsToPrg
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ProgId("DotNetFunctionsToPrg.ola")]
    [ComVisible(true)]
    [Guid("442CE27F-DA28-46FD-9074-60586C308299")]
    public class DotNetFunctionsToPrg
    {
        public string ola(string oi, string mundo)
        {
            return string.Format("{0}, {1}", oi, mundo);
        }
    }
}
Caso queira fazer o registro utilizando linha de comando ou bat
segue um código em bat para você utilizar :)

Código: Selecionar todos

@echo off

REM  --> Verificando permições
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> Em caso de erro, vc nao tem adm
if '%errorlevel%' NEQ '0' (
    echo requerindo privilegios de administrador
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"

:--------------------------

%windir%\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /tlb DotNetFunctionsToPrg.dll /codebase
pause
Certo, agora vamos compilar, e escrever o cóigo xBase:

Código: Selecionar todos

function main()
   inicia_a_dll()
return nil

function inicia_a_dll()
   local oDotNetDll := nil
   
   setmode(25,80)
   
   try
      oDotNetDll := GetActiveObject( "DotNetFunctionsToPrg.ola" )
   catch
      try
         oDotNetDll := CreateObject( "DotNetFunctionsToPrg.ola" )
      catch
         Alert( "ERRO! [" + Ole2TxtError()+ "]" )
         return
      end
   end   
    
   ? oDotNetDll:ola("Ola", "Mundo")
   
return nil
para compilar, vou utilizar algumas libs, tais como:
ActiveX.lib
Ole.lib
Segue fonte completo em anexo. :)
Anexos
xBase.zip
(381.9 KiB) Baixado 250 vezes
DotNetFunctionsToPrg.zip
(11.88 KiB) Baixado 263 vezes
Imagem
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Utilizando uma DLL escrita em CLR ( C# ) com xHB

Mensagem por alxsts »

Olá!

Obrigado por compartilhar. Vou testar.
[]´s
Alexandre Santos (AlxSts)
Ricardo Machado
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 02 Out 2018 15:15
Localização: recife/pe

Utilizando uma DLL escrita em CLR ( C# ) com xHB

Mensagem por Ricardo Machado »

Caro amigo;

Seu tutorial veio bem a calhar, no entanto encontrei um problema, pode ser que na minha pouco experiência com C# seja a questão :D . Seguinte, quando build meu projeto pelo o Visual Studio o registro no windows é feito automaticamente, mas utilizando o reg_dllnet.bat para instalação na máquina do usuário, a classe não é reconhecida (estanciada) pela aplicação. O seguinte erro ocorre
Descrição do erro.: Error TOleAuto/65535 : TOLEAUTO:NEW
Area Atual........: 2 -
Argumentos:
[ 1] = C AssinarXML.Signed
[ 2] = U AssinarXML.Signed
[ 3] = U AssinarXML.Signed

Lista de Chamada
================
Chamada de THROW(0)
Chamada de TOLEAUTO:NEW(346)
Chamada de CREATEOBJECT(78)
Chamada de WRITEFINISH(2242)

Inclusive utilizando seu exemplo main.exe o a falha também acontece. Apenas, consegui quando peguei seu projeto DotNetFunctionsToPrg.sln, e fiz Rebuild pelo o C#. Lembrando que uso xHB e na máquina do usuário não tem \Microsoft.NET\Framework64\v4.0.30319. O interessante, que ao fazer a consulta no Registro do Windows, a .Dll esta lá bonitinha.

Não sei mais o que fazer pra resolver, se o amigo tiver uma ideia que possa me ajudar agradecia imensamente.
Responder