2009-08-29 10 views
6

Cada ejemplo que puedo encontrar está en C++, pero estoy tratando de mantener mi proyecto en C. ¿Es posible incluso alojar el CLR en un programa C?¿Es posible alojar el CLR en un programa C?

Si es así, ¿me puede indicar un ejemplo?

+3

CLR API es una API COM. Básicamente, debe llamar a las interfaces COM en C. –

+0

... y para hacerlo, puede encontrar un artículo aquí: http://www.codeproject.com/KB/COM/com_in_c1.aspx –

+0

Voy a sé honesto y di que no tengo ni idea de lo que estoy haciendo. Soy un chico C#, no un chico C, por lo que el artículo tiene poco sentido para mí. ¿Hay algún ejemplo específico de alojamiento del CLR, creación de una instancia de objeto .NET y ejecución de un método en él (que probablemente sea bastante complicado)? –

Respuesta

10

Como se indica en la sugerencia de los comentarios anteriores, existe un conjunto de COM APIs for hosting the CLR, y debería poder llamar a estas API COM desde C y C++.

Como ejemplo, a continuación se muestra un fragmento de código C (no probado) que muestra cómo iniciar CLR y ejecutar un método estático de una clase en un ensamblado administrado (que toma una cadena como argumento y regresa un entero). La diferencia clave entre este código y su contraparte de C++ es la definición de COBJMACROS y el uso de las macros <type>_<method> (por ejemplo, ICLRRuntimeHost_Start) para llamar a la interfaz COM de alojamiento CLR. (Tenga en cuenta que debe COBJMACROS pueden definir antes de #include 'ing mscoree.h para asegurarse de que estas macros de servicios públicos quedan definidos.)

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

Esta muestra debe trabajar con .NET 2.0+, aunque parece que .NET 4.0 (aún no publicado) ha desaprobado algunas de estas API a favor de new set of APIs for hosting the CLR. (Y si necesita que esto funcione con .NET 1.x, necesita usar ICorRuntimeHost en lugar de ICLRRuntimeHost).

+0

Adivina por qué esto no funcionará: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname

Cuestiones relacionadas