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

3
正如标题所述,我想从非托管代码中调用一个混合模式程序集。
更确切地说,我想动态加载混合模式程序集,然后执行一些静态的非托管启动代码,注册一些用于 C# 代码的托管 C++ 包装器。
这是否可能(或者我需要嵌入 .Net 运行时或使用 COM?)?
有人已经做过这个并且可以分享一些经验吗?
附注:如果混合模式程序集包含 WPF 窗口,它会被启动吗?
1个回答

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 managed包装任何本地声明。

如果我不导出符号,只执行一些静态设置代码(注册本地回调),CLR是否也会被初始化? - sanosdole
不,C++/CLI编译器为支持托管函数上的__declspec(dllexport)生成的thunk是必不可少的。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接