Clipper On Line • Ver Tópico - Utilizando uma DLL escrita em CLR ( C# ) com xHB

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

 

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

Mensagempor bencz » 10 Fev 2013 12:14

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:

    [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 :)

        public string ola(string oi, string mundo)
        {
            return string.Format("{0}, {1}", oi, mundo);
        }


Segue código completo da lib em C#

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 :)

@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:

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 197 vezes
DotNetFunctionsToPrg.zip
(11.88 KiB) Baixado 197 vezes
Imagem
Avatar de usuário

bencz
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 517
Data de registro: 28 Abr 2012 17:36
Curtiu: 6 vezes
Mens.Curtidas: 34 vezes

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

Mensagempor alxsts » 11 Fev 2013 11:56

Olá!

Obrigado por compartilhar. Vou testar.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

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

Mensagempor Ricardo Machado » 03 Out 2018 14:20

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.
Ricardo Machado
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 1
Data de registro: 02 Out 2018 15:15
Cidade/Estado: recife/pe
Curtiu: 0 vez
Mens.Curtidas: 0 vez




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 20 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro