卸载混合模式组件
Unload mixed mode assembly
我有一个主要用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可以这样释放,但还没有深入分析。
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何将 txt 文件中的行分隔为组件C++
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 到连接组件算法的问题(递归)
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 QModelView 中组合模式对话框编辑器和就地小组件编辑器
- 带有singleton容器的c++工厂模式组件创建者
- 卸载混合模式组件
- 连接异构组件的设计模式
- 如何使用具有循环依赖性的组件模式正确地使用多态性