내가 찾을 수있는 모든 예제는 C++이지만 프로젝트를 C로 유지하려고합니다. C 프로그램에서 CLR을 호스팅 할 수 있습니까?C 프로그램에서 CLR을 호스팅 할 수 있습니까?
그렇다면 예제를 가르쳐 주시겠습니까?
내가 찾을 수있는 모든 예제는 C++이지만 프로젝트를 C로 유지하려고합니다. C 프로그램에서 CLR을 호스팅 할 수 있습니까?C 프로그램에서 CLR을 호스팅 할 수 있습니까?
그렇다면 예제를 가르쳐 주시겠습니까?
위의 주석 힌트대로 COM APIs for hosting the CLR 집합이 있고 C 및 C++에서 이러한 COM API를 호출 할 수 있어야합니다.
아래 예제는 CLR을 시작하고 관리되는 어셈블리에서 클래스의 정적 메서드를 실행하는 방법을 보여주는 (테스트되지 않은) C 코드입니다 (이 함수는 문자열을 인수로 사용하여 반환합니다). 정수). 이 코드와 C++의 주요한 차이점은 COBJMACROS
의 정의와 매크로를 사용하여 CLR 호스팅 COM 인터페이스를 호출하는 것입니다. (이 유틸리티 매크로가 정의 얻을 있는지 확인 mscoree.h
을 보내고 'COBJMACROS
이 이전 #include
에 정의되어야합니다.)
#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;
}
이 샘플은 .NET 2.0와 함께 작동합니다, 그것은 .NET 4.0 (처럼 보이지만 아직 출시되지 않음)은 new set of APIs for hosting the CLR을 위해 이러한 API 중 일부를 사용하지 않습니다. (당신이 .NET 1.x의 작업이 필요한 경우, 당신은 대신 ICLRRuntimeHost의 ICorRuntimeHost을 사용해야합니다.)
이것이 작동하지 않는 이유는 무엇입니까? http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname
CLR API는 COM API입니다. 기본적으로 C에서 COM 인터페이스를 호출해야합니다. –
... 이렇게하려면 여기에서 문서를 찾을 수 있습니다. http://www.codeproject.com/KB/COM/com_in_c1.aspx –
솔직히 말해서 나는 내가하는 일에 대해 전혀 모른다. 나는 C# 녀석이지 C 녀석이 아니기 때문에 그 기사는 나에게 거의 의미가 없다. CLR 호스팅, .NET 객체 인스턴스 생성 및 메서드 실행에 대한 구체적인 예가 있습니까 (실제로 상당히 복잡합니다). –