正如标题所说,我想从非托管代码调用混合模式程序集。
更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,为C#代码注册一些托管C ++ Wrappers。
这可能(或者我是否需要嵌入.Net Runtime或使用COM?)?
有人已经这样做并且可以分享一些经验吗?
PS:如果混合模式程序集包含WPF窗口,它将被启动吗?
答案 0 :(得分:2)
您需要加载并初始化CLR。是的,使用CorBindToRuntimeEx()创建托管类[ComVisible]或托管CLR是一种方法。一种非常简单的方法是从DLL导出托管函数,C ++ / CLI编译器将thunk嵌入到负责初始化CLR的代码中。很容易做到,但是当托管代码的界面很胖时,它不能很好地扩展。
ref class Bootstrap
{
public:
static void Initialize() {
// etc..
}
};
extern "C" __declspec(dllexport)
void __stdcall LoadAndInitialize()
{
Bootstrap::Initialize();
}
您可以通过将函数指针传递给本机接口来修饰。使用Marshal :: GetDelegateForFunctionPointer()将其转换为托管委托。如果这样做,请不要忘记使用#pragma managed包装任何本机声明。