Como chamar uma DLL .NET de um processo Win32?
-
22-07-2019 - |
Pergunta
Quais são as opções quando se trata de usar uma DLL .NET de um processo Win32? Eu preciso usar basicamente uma dll C# de um processo Win32.
Agora, tenho uma solução possível que requer a adição da DLL C# ao GAC (usando o regasm.exe) e, em seguida, chamando a DLL C# via com chamadas comuns. No entanto, essa solução é bastante pesada. Exige que a Dll .NET seja adicionada ao GAC Em todas as máquinas que devem executar este processo Win32.
Seria possível fazer isso sem ter que ligar RegAsm
Antes de poder usar a DLL C#?
Solução
Você pode usar com os componentes do .NET com componentes - veja aqui.
Outra opção é usar C ++/CLI como uma ponte. As pessoas estão familiarizadas com o uso de APIs não gerenciadas para expor ao código gerenciado, mas na verdade funciona nos dois sentidos - é possível compilar com /clr
, e ainda produzir um .dll
Assembléia com exportações simples não gerenciadas, que podem ser chamadas do código não gerenciado, como de costume. Aqui está um exemplo muito simples que expõe System::String::ToUpper
dessa maneira:
// compile with cl.exe /clr /LD wrapper.cpp ole32.lib
#include <windows.h>
__declspec(dllexport)
wchar_t* ToUpper(const wchar_t* wcs)
{
System::String^ s = gcnew System::String(wcs);
array<wchar_t>^ chars = s->ToUpper()->ToCharArray();
size_t size = chars->Length * 2;
wchar_t* dst = (wchar_t*)CoTaskMemAlloc(size + 2);
pin_ptr<wchar_t> src = &chars[0];
memcpy(dst, src, size);
dst[chars->Length] = 0;
return dst;
}
Isso produzirá wrapper.dll
- Assembléia gerenciada/não gerenciada híbrida - e uma biblioteca de exportação wrapper.lib
. Este último pode ser usado em um aplicativo nativo puro da seguinte maneira:
// compile with cl.exe test.cpp ole32.lib wrapper.lib
// note, no /clr
#include <stdio.h>
#include <windows.h>
wchar_t* ToUpper(const wchar_t* wcs);
int main()
{
wchar_t* s = ToUpper(L"foo");
wprintf(L"%s", s);
CoTaskMemFree(s);
}
Na prática, carregará o tempo de execução do CLR no processo de chamada (a menos que já esteja carregado lá) e despachará do código nativo para o código gerenciado de forma transparente - toda a mágica é feita pelo compilador C ++/CLI.
Outras dicas
Existem duas opções.
Primeiro, você pode usar Registro grátis com interop.
Segundo, você pode usar o APIs de hospedagem de CLR para hospedar diretamente o CLR e carregar a montagem. Isso funciona sem com.