2011-05-24 79 views
3

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

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

这是可能的(或者我需要嵌入.Net运行时或使用COM?)?

有没有人已经做到了这一点,可以分享一些经验?

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

回答

2

你需要获得CLR的加载和初始化。是的,制作托管类[ComVisible]或使用CorBindToRuntimeEx()自行托管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管理任何本地声明。

+0

如果我不导出符号并执行一些静态设置代码(注册本机回调),CLR是否也会被初始化? – sanosdole 2011-05-24 13:35:44

+0

不,C++/CLI编译器生成的用于支持托管函数的__declspec(dllexport)的thunk必不可少。 – 2011-05-24 15:29:37