从非托管代码加载混合模式程序集

正如标题所说,我想从非托管代码调用混合模式程序集。

更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,为C#代码注册一些托管C ++ Wrappers。

这可能(或者我需要嵌入.Net Runtime还是使用COM?)?

有人已经这样做了,可以分享一些经验吗?

PS:如果混合模式程序集包含WPF窗口,它将启动吗?

您需要加载并初始化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包装任何本机声明。