【问题标题】:Is it possible to host the CLR in a C program?是否可以在 C 程序中托管 CLR?
【发布时间】:2010-11-23 22:15:04
【问题描述】:

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

如果是这样,你能给我举个例子吗?

【问题讨论】:

  • CLR API 是一个 COM API。基本上,您应该在 C 中调用 COM 接口。
  • ...为此,您可以在此处找到一篇文章:codeproject.com/KB/COM/com_in_c1.aspx
  • 老实说,我完全不知道自己在做什么。我是 C# 人,而不是 C 人,所以这篇文章对我来说毫无意义。是否有托管 CLR、创建 .NET 对象实例并在其上执行方法的具体示例(我意识到这可能相当复杂)?
  • 特别是,您根本不需要COM in Plain C 文章,托管CLR 要容易得多。这是一篇不错的概述文章。

标签: c clr clr-hosting


【解决方案1】:

正如上面 cmets 所暗示的,有一组 COM APIs for hosting the CLR,你应该可以从 C 和 C++ 中调用这些 COM API。

例如,下面是一段简短的(未经测试的)C 代码,它显示了如何启动 CLR 并在托管程序集中执行类的静态方法(它接受一个字符串作为参数并返回一个整数)。此代码与其对应的 C++ 代码之间的主要区别在于 COBJMACROS 的定义以及使用 <type>_<method> 宏(例如 ICLRRuntimeHost_Start)调用 CLR 托管 COM 接口。 (请注意,COBJMACROS 必须#include'ing 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。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-07-04
  • 2015-09-24
  • 2010-09-21
  • 1970-01-01
相关资源
最近更新 更多