Win32 프로세스에서 .NET DLL을 호출하는 방법은 무엇입니까?
-
22-07-2019 - |
문제
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없이 작동합니다.