2009-08-29 8 views
6

Ogni esempio che riesco a trovare è in C++, ma sto cercando di mantenere il mio progetto in C. È persino possibile ospitare il CLR in un programma C?È possibile ospitare il CLR in un programma C?

In tal caso, puoi indicarmi un esempio?

+3

API CLR è un'API COM. Fondamentalmente, dovresti chiamare le interfacce COM in C. –

+0

... e per fare ciò, puoi trovare un articolo qui: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Sto andando a sii onesto e dì che non ho assolutamente idea di quello che sto facendo. Sono un ragazzo di C#, non un ragazzo di C, quindi quell'articolo ha poco senso per me. Esiste un esempio specifico di hosting del CLR, creazione di un'istanza di oggetto .NET ed esecuzione di un metodo su di esso (cosa che mi rendo conto è probabilmente abbastanza complicato)? –

risposta

10

Come suggerito sopra, c'è un set di COM APIs for hosting the CLR e dovresti essere in grado di chiamare queste API COM sia da C che da C++.

Ad esempio, di seguito è un breve pezzo di codice C (non testato) che mostra come avviare il CLR ed eseguire un metodo statico di una classe in un assembly gestito (che accetta una stringa come argomento e restituisce un numero intero). La differenza principale tra questo codice e la sua controparte C++ è la definizione di COBJMACROS e l'uso dei macro <type>_<method> (ad esempio ICLRRuntimeHost_Start) per chiamare nell'interfaccia COM di hosting CLR. (Si noti che COBJMACROSdeve essere definito prima di #include 'ing mscoree.h per assicurarsi che queste macro utilità vengono definite.)

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

Questo esempio dovrebbe funzionare con .NET 2.0 +, anche se sembra NET 4.0 (non ancora rilasciato) ha deprecato alcune di queste API a favore di un new set of APIs for hosting the CLR. (E se hai bisogno di questo per lavorare con .NET 1.x, devi usare ICorRuntimeHost invece di ICLRRuntimeHost.)

+0

Qualsiasi ipotesi sul perché questo non funzionerà: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

Problemi correlati