2009-12-01 2 views
8

Win32 프로세스에서 .NET DLL을 사용할 때 어떤 옵션이 있습니까? 기본적으로 Win32 프로세스에서 C# DLL을 사용해야합니다.Win32 프로세스에서 .NET DLL을 호출하는 방법은 무엇입니까?

GAC (RegAsm.exe 사용)에 C# DLL을 추가 한 다음 COM 랩핑 된 호출을 통해 C# DLL을 호출해야하는 가능한 해결책이 있습니다. 그러나 그 솔루션은 꽤 무거워요. 이 DLL을이 Win32 프로세스를 실행하기로되어있는 모든 컴퓨터의 GAC에 추가해야합니다.

C# DLL을 사용하기 전에 RegAsm을 호출 할 필요없이이 작업을 수행 할 수 있습니까?

+0

Regasm.exe/codebase 옵션을 사용하여 GAC에있을 필요는 없습니다. –

답변

11

.NET COM 구성 요소와 함께 등록이 필요없는 COM을 사용할 수 있습니다 (here 참조).

또 다른 옵션은 C++/CLI를 브리지로 사용하는 것입니다. 사람들은 대부분 관리되지 않는 API를 래핑하여 관리되는 코드로 표시하는 데 익숙하지만 실제로는 두 가지 방식으로 작동합니다. /clr으로 컴파일 할 수 있지만 비 관리 코드에서 호출 할 수있는 일반 관리되지 않는 내보내기로 .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을. 다음과 같이 후자는 순수 네이티브 응용 프로그램에서 사용할 수 있습니다

투명하게 관리 코드에 네이티브 코드에서 (이 이미 장전하지 않는 한)는 호출 프로세스에 CLR 런타임을로드 연습과 파견에
// 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); 
} 

- 모든 마법은 C++/CLI 컴파일러에 의해 수행됩니다.

+0

이것은 매우 좋게 들리지만, 대단히 감사합니다. 이 솔루션을 살펴 보겠습니다. –

+0

*'here' *는 [등록없는 사용을위한 .NET 기반 구성 요소 구성] (https://msdn.microsoft.com/en-us/library/eew13bza (VS.71) .aspx) ... MS가 (다시) 이동하기로 결정한 경우 ... – Wolf

7

두 가지 옵션이 있습니다.

먼저 Registration Free COM Interop을 사용할 수 있습니다.

두 번째로 CLR Hosting APIs을 사용하여 CLR을 직접 호스팅하고 어셈블리를로드 할 수 있습니다. 이것은 COM없이 작동합니다.

+1

CLR 호스팅 API는 C++/CLI를 악용하여 간접적으로 사용할 수 있습니다 - 내 대답에 대한 업데이트를 참조하십시오. –