2009-08-29 1 views
6

내가 찾을 수있는 모든 예제는 C++이지만 프로젝트를 C로 유지하려고합니다. C 프로그램에서 CLR을 호스팅 할 수 있습니까?C 프로그램에서 CLR을 호스팅 할 수 있습니까?

그렇다면 예제를 가르쳐 주시겠습니까?

+3

CLR API는 COM API입니다. 기본적으로 C에서 COM 인터페이스를 호출해야합니다. –

+0

... 이렇게하려면 여기에서 문서를 찾을 수 있습니다. http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

솔직히 말해서 나는 내가하는 일에 대해 전혀 모른다. 나는 C# 녀석이지 C 녀석이 아니기 때문에 그 기사는 나에게 거의 의미가 없다. CLR 호스팅, .NET 객체 인스턴스 생성 및 메서드 실행에 대한 구체적인 예가 있습니까 (실제로 상당히 복잡합니다). –

답변

10

위의 주석 힌트대로 COM APIs for hosting the CLR 집합이 있고 C 및 C++에서 이러한 COM API를 호출 할 수 있어야합니다.

아래 예제는 CLR을 시작하고 관리되는 어셈블리에서 클래스의 정적 메서드를 실행하는 방법을 보여주는 (테스트되지 않은) C 코드입니다 (이 함수는 문자열을 인수로 사용하여 반환합니다). 정수). 이 코드와 C++의 주요한 차이점은 COBJMACROS의 정의와 매크로를 사용하여 CLR 호스팅 COM 인터페이스를 호출하는 것입니다. (이 유틸리티 매크로가 정의 얻을 있는지 확인 mscoree.h을 보내고 'COBJMACROS 이전 #include에 정의되어야합니다.)

#include <windows.h> 

#define COBJMACROS 
#include <mscoree.h> 

int main(int argc, char **argv) 
{ 
    HRESULT status; 
    ICLRRuntimeHost *Host; 
    BOOL Started; 
    DWORD Result; 

    Host = NULL; 
    Started = FALSE; 

    status = CorBindToRuntimeEx(
       NULL, 
       NULL, 
       0, 
       &CLSID_CLRRuntimeHost, 
       &IID_ICLRRuntimeHost, 
       (PVOID *)&Host 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    status = ICLRRuntimeHost_Start(Host); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    Started = TRUE; 

    status = ICLRRuntimeHost_ExecuteInDefaultAppDomain(
       Host, 
       L"c:\\path\\to\\assembly.dll", 
       L"MyNamespace.MyClass", 
       L"MyMethod", 
       L"some string argument to MyMethod", 
       &Result 
       ); 
    if (FAILED(status)) { 
     goto cleanup; 
    } 

    // inspect Result 
    // ... 

cleanup: 
    if (Started) { 
     ICLRRuntimeHost_Stop(Host); 
    } 

    if (Host != NULL) { 
     ICLRRuntimeHost_Release(Host); 
    } 

    return SUCCEEDED(status) ? 0 : 1; 
} 

이 샘플은 .NET 2.0와 함께 작동합니다, 그것은 .NET 4.0 (처럼 보이지만 아직 출시되지 않음)은 new set of APIs for hosting the CLR을 위해 이러한 API 중 일부를 사용하지 않습니다. (당신이 .NET 1.x의 작업이 필요한 경우, 당신은 대신 ICLRRuntimeHost의 ICorRuntimeHost을 사용해야합니다.)

+0

이것이 작동하지 않는 이유는 무엇입니까? http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname