6

私が見つけることができるすべての例はC++ですが、プロジェクトをCで維持しようとしています。CプログラムでCLRをホストすることも可能ですか?

もしそうなら、私に例を教えてもらえますか?

4

1 に答える 1

10

上記のコメントが示すように、 CLR をホストするための COM APIのセットがあり、C と C++ の両方からこれらの COM API を呼び出すことができるはずです。

例として、CLR を起動し、マネージド アセンブリ内のクラスの静的メソッドを実行する方法を示す (テストされていない) C コードの簡単な部分を以下に示します (引数として文字列を受け取り、整数を返します)。このコードと対応する C++ コードの主な違いは、CLR ホスティング COM インターフェイスを呼び出すためのマクロ (例: ) の定義COBJMACROSと使用です。(これらのユーティリティ マクロが確実に定義されるように、 'ing の前に定義する必要があることに注意してください。)<type>_<method>ICLRRuntimeHost_StartCOBJMACROS #includemscoree.h

#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 (まだリリースされていません) ではこれらの API の一部が廃止され、CLR をホストするための新しい API セットが採用されたようです。(そして、これを .NET 1.x で動作させる必要がある場合は、ICLRRuntimeHost の代わりに ICorRuntimeHost を使用する必要があります )

于 2009-09-03T08:58:52.143 に答える