2009-08-29 7 views
6

Każdy przykład, jaki mogę znaleźć, znajduje się w C++, ale próbuję zachować mój projekt w C. Czy możliwe jest nawet umieszczenie CLR w programie C?Czy można uruchomić środowisko CLR w programie C?

Jeśli tak, czy możesz wskazać mi przykład?

+3

CLR API to interfejs API COM. Zasadniczo powinieneś wywoływać interfejsy COM w C. –

+0

... a do tego możesz znaleźć artykuł: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Idę do bądź szczery i powiedz, że absolutnie nie mam pojęcia, co robię. Jestem facetem C#, a nie C, więc ten artykuł nie ma dla mnie większego sensu. Czy istnieje konkretny przykład hostowania CLR, tworzenia instancji obiektu .NET i wykonywania na niej metody (która, jak rozumiem, jest prawdopodobnie dość skomplikowana)? –

Odpowiedz

10

Jak wspomniano powyżej, istnieje zestaw COM APIs for hosting the CLR, a powinieneś być w stanie wywoływać te COM API z C i C++.

Jako przykład poniżej przedstawiono szybki fragment (nietestowanego) kodu C, który pokazuje, jak uruchomić CLR i wykonać statyczną metodę klasy w zarządzanym zestawie (który przyjmuje ciąg jako argument i zwraca Liczba całkowita). Kluczową różnicą między tym kodem a jego odpowiednikiem w C++ jest definicja COBJMACROS i użycie makr (ICLRRuntimeHost_Start) do wywoływania interfejsu COM COM hostującego CLR. (Zauważ, że COBJMACROSmusi być zdefiniowane przed #include „ing mscoree.h, aby upewnić się te makra użytkowych uzyskać określone.)

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

Próbka ta powinna pracować z .NET 2.0+, choć wygląda jak .NET 4.0 (jeszcze nie wydane) wycofał niektóre z tych API na rzecz new set of APIs for hosting the CLR. (A jeśli potrzebujesz tego do pracy z .NET 1.x, musisz użyć ICorRuntimeHost zamiast ICLRRuntimeHost.)

+0

Wszelkie przypuszczenia, dlaczego to nie zadziała: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

Powiązane problemy