문제

Win32 프로세스에서 .NET DLL을 사용할 때 옵션은 무엇입니까? 기본적으로 Win32 프로세스에서 C# DLL을 사용해야합니다.

GAC에 C# DLL을 추가 해야하는 솔루션이 있습니다 (Regasm.exe를 사용하여) 한 다음 COM 랩핑 호출을 통해 C# DLL을 호출합니다. 그러나 그 솔루션은 꽤 무겁습니다. .net dll을 GAC 이 Win32 프로세스를 실행 해야하는 모든 기계에서.

전화하지 않고이 일을 할 수 있습니까? RegAsm c# dll을 사용할 수 있기 전에?

도움이 되었습니까?

해결책

.NET COM 구성 요소와 함께 등록이없는 COM을 사용할 수 있습니다. 여기.

또 다른 옵션은 C ++/CLI를 브리지로 사용하는 것입니다. 사람들은 관리 코드에 노출시키기 위해 관리되지 않은 API를 래핑하는 데 사용하는 데 익숙하지만 실제로 두 가지 방법으로 작동합니다. /clr, 그러나 아직 생산 a .dll 평범한 관리되지 않은 수출을 가진 어셈블리. 평소와 같이 관리되지 않는 코드에서 호출 할 수 있습니다. 다음은 노출되는 매우 간단한 예입니다 System::String::ToUpper 그런 식으로:

// 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;
}

이것은 생산할 것입니다 wrapper.dll - 하이브리드 관리/관리되지 않은 조립 - 및 수출 도서관 wrapper.lib. 후자는 다음과 같이 순수한 기본 응용 프로그램에서 사용될 수 있습니다.

// 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);
}

실제로 CLR 런타임을 호출 프로세스에로드하고 (이미로드되지 않았다면) 기본 코드에서 관리 된 코드로 투명하게 발송합니다. 모든 마법은 C ++/CLI 컴파일러에 의해 수행됩니다.

다른 팁

두 가지 옵션이 있습니다.

먼저 사용할 수 있습니다 등록 무료 COM 인터 로프.

둘째, 당신은 그것을 사용할 수 있습니다 CLR 호스팅 API CLR을 직접 호스팅하고 어셈블리를로드합니다. 이것은 com없이 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top