2009-08-29 20 views
6

Jedes Beispiel, das ich finden kann, ist in C++, aber ich versuche, mein Projekt in C zu behalten. Ist es sogar möglich, die CLR in einem C-Programm zu hosten?Kann die CLR in einem C-Programm gehostet werden?

Wenn ja, können Sie mich auf ein Beispiel hinweisen?

+3

CLR-API ist eine COM-API. Im Grunde sollten Sie COM-Schnittstellen in C. aufrufen. –

+0

... und dafür finden Sie hier einen Artikel: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Ich werde sei ehrlich und sage, dass ich absolut keine Ahnung habe, was ich mache. Ich bin ein C# -Typ, kein C-Typ, also macht dieser Artikel wenig Sinn für mich. Gibt es ein konkretes Beispiel für das Hosten der CLR, das Erstellen einer .NET-Objektinstanz und das Ausführen einer Methode auf dieser (die, wie ich realisiere, wahrscheinlich ziemlich kompliziert ist)? –

Antwort

10

Wie die obigen Kommentare Hinweis, gibt es eine Reihe von COM APIs for hosting the CLR, und Sie sollten diese COM-APIs von C und C++ aufrufen können.

Als Beispiel folgt unten ein kurzer Teil von (ungetestetem) C-Code, der zeigt, wie die CLR gestartet und eine statische Methode einer Klasse in einer verwalteten Assembly ausgeführt wird (die einen String als Argument akzeptiert und zurückgibt) eine ganze Zahl). Der Hauptunterschied zwischen diesem Code und seinem C++ - Gegenstück besteht in der Definition von COBJMACROS und der Verwendung der <type>_<method>-Makros (z. B. ICLRRuntimeHost_Start) zum Aufrufen der CLR-Hosting-COM-Schnittstelle. (Beachten Sie, dass COBJMACROSmuss vor #include definiert werden ‚mscoree.h ing dieses Utility-Makros, um sicherzustellen, definiert erhalten.)

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

Diese Probe mit .NET arbeiten sollte 2.0+, obwohl es wie .NET 4.0 aussieht (noch nicht freigegeben) hat einige dieser APIs zugunsten einer new set of APIs for hosting the CLR veraltet. (Und wenn Sie dies mit .NET 1.x benötigen, müssen Sie ICorRuntimeHost anstelle von ICLRRuntimeHost verwenden.)

+0

Irgendeine Vermutung, warum das nicht funktioniert: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdappaintainerror-0x80131513? – displayname

Verwandte Themen