我能找到的每个示例都是用 C++ 编写的,但我试图将我的项目保留在 C 中。甚至可以在 C 程序中托管 CLR 吗?
如果是这样,你能给我举个例子吗?
正如上述评论所暗示的,有一组用于托管 CLR 的 COM API,您应该能够从 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,取而代之的是一组用于托管 CLR 的新 API。(如果您需要它与 .NET 1.x 一起使用,则需要使用ICorRuntimeHost而不是 ICLRRuntimeHost。)