É possível hospedar o CLR em um programa C?
-
20-09-2019 - |
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?
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.)