Pergunta

Todo exemplo que posso encontrar está no C ++, mas estou tentando manter meu projeto em C. É possível hospedar o CLR em um programa C?

Se sim, você pode me apontar para um exemplo?

Foi útil?

Solução

Como os comentários acima sugerem, há um conjunto de Com APIs para hospedar o CLR, e você poderá chamar essas APIs de C e C ++.

Como exemplo, abaixo está um código C rápido (não testado) que mostra como iniciar o CLR e executar um método estático de uma classe em uma montagem gerenciada (que pega uma string como argumento e retorna um número inteiro). A principal diferença entre este código e sua contraparte C ++ é a definição de COBJMACROS e o uso do <type>_<method> Macros (por exemplo ICLRRuntimeHost_Start) para ligar para a interface COM de Host CLR. (Observe que COBJMACROS devo ser definido antes de #include'ing mscoree.h para garantir que essas macros do utilitário sejam definidas.)

#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 amostra deve funcionar com .NET 2.0+, embora pareça .NET 4.0 (ainda não liberado), depreciou algumas dessas APIs em favor de um Novo conjunto de APIs para hospedar o CLR. (E se você precisar disso para trabalhar com .NET 1.x, você precisa usar Icorruntimehost em vez de iclrruntimehost.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top