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.
Após isso, vá em Signing, e marque a opção Sign the Assembly e vá na opção, <New>
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:
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. :)