2009-08-29 6 views
6

Chaque exemple que je peux trouver est en C++, mais j'essaie de garder mon projet en C. Est-il même possible d'héberger le CLR dans un programme C?Est-il possible d'héberger le CLR dans un programme C?

Si oui, pouvez-vous me donner un exemple?

+3

L'API CLR est une API COM. Fondamentalement, vous devriez appeler les interfaces COM dans C. –

+0

... et pour ce faire, vous pouvez trouver un article ici: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Je vais Sois honnête et dis que je n'ai absolument aucune idée de ce que je fais. Je suis un gars C#, pas un gars C, donc cet article n'a pas beaucoup de sens pour moi. Existe-t-il un exemple spécifique d'hébergement du CLR, de création d'une instance d'objet .NET et d'exécution d'une méthode (ce que je réalise est probablement assez compliqué)? –

Répondre

10

Comme l'indique le commentaire ci-dessus, il existe un ensemble de COM APIs for hosting the CLR, et vous devriez être capable d'appeler ces API COM à partir de C et C++. A titre d'exemple, voici un exemple rapide de code C (non testé) qui montre comment démarrer le CLR et exécuter une méthode statique d'une classe dans un assembly géré (qui prend une chaîne comme argument et renvoie un nombre entier). La principale différence entre ce code et son homologue C++ est la définition de COBJMACROS et l'utilisation des macros <type>_<method> (par exemple ICLRRuntimeHost_Start) pour appeler dans l'interface COM d'hébergement CLR. (Notez que COBJMACROSdoit être défini avant #include « ing mscoree.h pour que ces macros utilitaires se définir.)

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

Cet exemple devrait fonctionner avec .NET 2.0+, bien qu'il ressemble à .NET 4.0 (pas encore publié) a désapprouvé certaines de ces API en faveur d'un new set of APIs for hosting the CLR. (Et si vous avez besoin de cela pour travailler avec .NET 1.x, vous devez utiliser ICorRuntimeHost au lieu de ICLRRuntimeHost.)

+0

Tout devinez pourquoi cela ne fonctionnera pas: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

Questions connexes