卸载混合模式组件
本文关键字:组件 模式 混合 卸载 | 更新日期: 2023-09-27 18:15:28
我有一个主要用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可以这样释放,但还没有深入分析。