3
正如标题所说,我想从非托管代码调用混合模式程序集。从非托管代码加载混合模式程序集
更确切地说,我想动态加载混合模式程序集,然后执行一些静态的非托管启动代码,为C#代码注册一些托管C++包装程序。
这是可能的(或者我需要嵌入.Net运行时或使用COM?)?
有没有人已经做到了这一点,可以分享一些经验?
PS:如果混合模式程序集包含WPF窗口,它会启动吗?
正如标题所说,我想从非托管代码调用混合模式程序集。从非托管代码加载混合模式程序集
更确切地说,我想动态加载混合模式程序集,然后执行一些静态的非托管启动代码,为C#代码注册一些托管C++包装程序。
这是可能的(或者我需要嵌入.Net运行时或使用COM?)?
有没有人已经做到了这一点,可以分享一些经验?
PS:如果混合模式程序集包含WPF窗口,它会启动吗?
你需要获得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管理任何本地声明。
如果我不导出符号并执行一些静态设置代码(注册本机回调),CLR是否也会被初始化? – sanosdole 2011-05-24 13:35:44
不,C++/CLI编译器生成的用于支持托管函数的__declspec(dllexport)的thunk必不可少。 – 2011-05-24 15:29:37