Każdy przykład, jaki mogę znaleźć, znajduje się w C++, ale próbuję zachować mój projekt w C. Czy możliwe jest nawet umieszczenie CLR w programie C?Czy można uruchomić środowisko CLR w programie C?
Jeśli tak, czy możesz wskazać mi przykład?
Każdy przykład, jaki mogę znaleźć, znajduje się w C++, ale próbuję zachować mój projekt w C. Czy możliwe jest nawet umieszczenie CLR w programie C?Czy można uruchomić środowisko CLR w programie C?
Jeśli tak, czy możesz wskazać mi przykład?
Jak wspomniano powyżej, istnieje zestaw COM APIs for hosting the CLR, a powinieneś być w stanie wywoływać te COM API z C i C++.
Jako przykład poniżej przedstawiono szybki fragment (nietestowanego) kodu C, który pokazuje, jak uruchomić CLR i wykonać statyczną metodę klasy w zarządzanym zestawie (który przyjmuje ciąg jako argument i zwraca Liczba całkowita). Kluczową różnicą między tym kodem a jego odpowiednikiem w C++ jest definicja COBJMACROS
i użycie makr (ICLRRuntimeHost_Start
) do wywoływania interfejsu COM COM hostującego CLR. (Zauważ, że COBJMACROS
musi być zdefiniowane przed #include
„ing mscoree.h
, aby upewnić się te makra użytkowych uzyskać określone.)
#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;
}
Próbka ta powinna pracować z .NET 2.0+, choć wygląda jak .NET 4.0 (jeszcze nie wydane) wycofał niektóre z tych API na rzecz new set of APIs for hosting the CLR. (A jeśli potrzebujesz tego do pracy z .NET 1.x, musisz użyć ICorRuntimeHost zamiast ICLRRuntimeHost.)
Wszelkie przypuszczenia, dlaczego to nie zadziała: http://stackoverflow.com/questions/21537338/iclrruntimehost-executeindefaultappdomain-error-0x80131513? – displayname
CLR API to interfejs API COM. Zasadniczo powinieneś wywoływać interfejsy COM w C. –
... a do tego możesz znaleźć artykuł: http://www.codeproject.com/KB/COM/com_in_c1.aspx –
Idę do bądź szczery i powiedz, że absolutnie nie mam pojęcia, co robię. Jestem facetem C#, a nie C, więc ten artykuł nie ma dla mnie większego sensu. Czy istnieje konkretny przykład hostowania CLR, tworzenia instancji obiektu .NET i wykonywania na niej metody (która, jak rozumiem, jest prawdopodobnie dość skomplikowana)? –