是否可以在C程序中托管CLR?
我能找到的每个例子都是用C ++编写的,但我试图将我的项目保存在C中。是否有可能在C程序中托管CLR?
如果是这样,你能指点我一个例子吗?
正如上面的注释提示,有一组用于托管CLR的COM API ,您应该能够从C和C ++调用这些COM API。
作为一个例子,下面是一段快速的(未经测试的)C代码,它展示了如何启动CLR并在托管程序集中执行类的静态方法(它接受一个字符串作为参数并返回一个整数)。 此代码与其C ++对应代码之间的主要区别在于COBJMACROS
的定义以及使用
宏(例如ICLRRuntimeHost_Start
)调用CLR托管COM接口。 (请注意, 必须在#include
COBJMACROS
之前定义COBJMACROS
,以确保定义这些实用程序宏。)
#include #define COBJMACROS #include 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,转而使用一组新的API来托管CLR 。 (如果您需要使用.NET 1.x,则需要使用ICorRuntimeHost而不是ICLRRuntimeHost。)