gpt4 book ai didi

c - 是否可以在 C 程序中承载 CLR?

转载 作者:太空狗 更新时间:2023-10-29 17:20:20 25 4
gpt4 key购买 nike

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

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

最佳答案

正如上面的评论所暗示的,有一组 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com