6 Stimmen

Ist es möglich, die CLR in einem C-Programm zu hosten?

Jedes Beispiel, das ich finden kann, ist in C++, aber ich versuche, mein Projekt in C zu halten. Ist es überhaupt möglich, die CLR in einem C-Programm zu hosten?

Wenn ja, können Sie mir ein Beispiel nennen?

10voto

reuben Punkte 3320

Wie aus den obigen Bemerkungen hervorgeht, gibt es eine Reihe von COM-APIs für das Hosting der CLR und Sie sollten in der Lage sein, diese COM-APIs sowohl von C als auch von C++ aus aufzurufen.

Im Folgenden finden Sie ein kurzes Stück (ungetesteten) C-Code, der zeigt, wie die CLR gestartet und eine statische Methode einer Klasse in einer verwalteten Assembly ausgeführt wird (die eine Zeichenkette als Argument annimmt und eine ganze Zahl zurückgibt). Der Hauptunterschied zwischen diesem Code und seinem C++-Pendant ist die Definition von COBJMACROS und die Verwendung des <type>_<method> Makros (z. B. ICLRRuntimeHost_Start ), um die CLR-hosting COM-Schnittstelle aufzurufen. (Beachten Sie, dass COBJMACROS muss definiert werden, bevor #include ing mscoree.h um sicherzustellen, dass diese Hilfsmakros definiert werden).

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

Dieses Beispiel sollte mit .NET 2.0+ funktionieren, obwohl es so aussieht, als ob .NET 4.0 (noch nicht veröffentlicht) einige dieser APIs zugunsten einer eine neue Reihe von APIs für das Hosting der CLR . (Und wenn dies mit .NET 1.x funktionieren soll, müssen Sie ICorRuntimeHost anstelle von ICLRRuntimeHost.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X