卸载混合模式组件

Unload mixed mode assembly

本文关键字:组件 模式 混合 卸载      更新时间:2023-10-16

我有一个主要用c++开发的本地windows应用程序。我想把一些c#/UI组件放在该应用程序的顶部。但是主应用程序的启动和调试相当繁重,我希望c#对应用程序有礼貌,并且可以在不关闭本机应用程序的情况下尽可能长时间地开发UI。

在c++中总是有LoadLibrary和FreeLibrary -所以开发人员可以在开发他的组件时释放。dll,在c#中一旦你加载了你的程序集,几乎不可能释放它。你要处理大量关于AppDomains等的文档。

谁能提出一种方法来发布c#汇编一旦加载了尽可能少的源代码行?

现在我将简要总结一下我对主题的了解:

  • 这是可能的创建托管。dll和使用c++/cli它可以做任何在你的appDomain,但是一旦你使用了c++/cli -该。dll成为负载(不能被释放)。(# 1)

  • 有可能根本不使用托管c++,但使用本机c++/COM技术使用CLRCreateInstance, GetRuntime, GetInterface…等等——但是你要处理的是相当复杂的c++/com类。只是连接一个函数调用——这是非常痛苦的。(托管c++更容易使用)(#2)

  • 可以从c++/com创建appDomain。你只需要调用ICorRuntimeHost:: createddomain。最有趣的是,加载到该appdomain中的程序集不能被visual studio识别为程序集,它们的调试符号不可用,断点也不起作用。

  • 可以将#2与#1一起使用-然而-汇编。加载将无法工作,因为错误:"hr 0x80131019:试图加载带有修复程序的不可验证的可执行文件(IAT具有超过2个部分或TLS部分)",并使用汇编。LoadFrom会再次锁定你的dll。

  • 最后可以使用#2 + Assembly。加载,但是作为可加载的项目来使用基于c#的项目(没有IAT表)-然后你可以最终分配第二个appDomain,并从那里开始组装。我已经制作了这个原型,我将把它作为一个答案——但是没有更简单的方法吗?

如果没有IAT表,c++汇编是不可能构建的——至少在这里有一些关于建议的解决方案:

如何在c/c++中构建一个没有导入表的可执行文件?

嗯…6年后,我找到了一个解决方案:

https://github.com/tapika/dllloader

将c++/cli .dll加载到RAM中-然后也不需要释放它。

这至少适用于.net 4.8 framework。对于.net core,有可能c++/cli dll可以这样释放,但还没有深入分析。