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

C# 从非托管代码加载混合模式程序集,c#,.net,wpf,pinvoke,managed-c++,C#,.net,Wpf,Pinvoke,Managed C++,正如标题所说,我想从非托管代码调用混合模式程序集 更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,注册一些用于C++代码的托管C++包装。 这可能吗(或者我需要嵌入.Net运行时还是使用COM?) 有没有人已经这样做了,可以分享一些经验 PS:如果混合模式程序集包含WPF窗口,它是否会启动?您需要加载并初始化CLR。是的,使用CorBindToRuntimeEx()创建托管类[ComVisible]或自己托管CLR是一种方法。一种非常简单的方法是从DLL导出托管函数,C+

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

更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,注册一些用于C++代码的托管C++包装。 这可能吗(或者我需要嵌入.Net运行时还是使用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包装任何本机声明。

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