是否有可能举办一个C程序的CLR?(Is it possible to host the CLR i

2019-07-04 00:54发布

每个例子,我能找到的是在C ++中,但我想保持我的项目在C.它甚至有可能举办一个C程序的CLR?

如果是的话,你可以点我一个例子吗?

Answer 1:

正如上述评论暗示,有一组主办CLR COM的API ,你应该能够从C和C ++调用这些COM的API。

作为一个例子,下面是一个快速片(未测试的)C代码,显示如何启动CLR和执行一类在一个管理组件一个静态方法(这需要在一个字符串作为参数并返回一个整数)。 此代码和它的C ++对方之间的关键区别是定义COBJMACROS和使用的<type>_<method>宏(例如ICLRRuntimeHost_Start )来调用到CLR托管COM接口。 (请注意, COBJMACROS 必须事先定义#include “荷兰国际集团mscoree.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的工作,你需要使用ICorRuntimeHost代替ICLRRuntimeHost。)



文章来源: Is it possible to host the CLR in a C program?