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#?

Foi útil?

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.

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