我可以找到的每个示例都是C++,但是我试图将项目保留在C中。甚至可以将CLR托管在C程序中吗?

如果是这样,您能给我指出一个例子吗?

最佳答案

如上面的注释所示,有一组COM APIs for hosting the CLR,您应该能够从C和C++调用这些COM API。

例如,下面是一段简短的(未经测试的)C代码,该代码展示了如何启动CLR并在托管程序集中执行类的静态方法(该方法将字符串作为参数并返回整数)。此代码与其C++副本之间的主要区别在于COBJMACROS的定义以及<type>_<method>宏(例如ICLRRuntimeHost_Start)的使用,以调用CLR托管COM接口(interface)。 (请注意,必须先在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,而推荐使用new set of APIs for hosting the CLR。 (并且,如果您需要使用它来与.NET 1.x配合使用,则需要使用ICorRuntimeHost而不是ICLRRuntimeHost。)

关于c - 是否可以在C程序中托管CLR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1350215/

10-09 16:29
查看更多