我能找到的每个例子都是用C ++编写的,但我正在尝试将我的项目保存在C中。是否可以在C程序中托管CLR?
如果是这样,你能指点我一个例子吗?
答案 0 :(得分:10)
正如上面的评论提示,有一组COM APIs for hosting the CLR,您应该可以从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而转而支持new set of APIs for hosting the CLR。 (如果您需要使用.NET 1.x,则需要使用ICorRuntimeHost而不是ICLRRuntimeHost。)