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

时间:2011-05-24 13:00:39

标签: c# .net wpf pinvoke managed-c++

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

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

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

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

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

1 个答案:

答案 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包装任何本机声明。