卸载混合模式程序集

时间:2016-10-27 19:55:34

标签: c# c++ mixed-mode

我的本​​机Windows应用程序主要是用C ++开发的。我想在该应用程序之上放置一些C#/ UI组件。但主要应用程序启动和调试相当繁重,我希望C#对应用程序有礼貌,并且可以在不关闭本机应用程序的情况下开发UI。

在C ++中总有LoadLibrary和FreeLibrary - 所以开发人员可以在开发组件期间释放.dll,在C#中加载组件后几乎不可能释放它。您正在处理AppDomains上的大量文档等。

一旦有人尽可能少地加载源代码行,有人可以提出一种释放C#程序集的方法吗?

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

  • 可以创建托管的.dll并使用C ++ / cli它可以在你的appDomain中做任何事情,但是一旦你使用了C ++ / cli - .dll就会变成负载(不能被释放)。 (#1)

  • 根本不可能使用托管C ++,但是使用CLRCreateInstance,GetRuntime,GetInterface等等使用本机C ++ / COM技术进行有线函数调用 - 但是之后你就可以了处理相当复杂的c ++ / com类。只是连接一个函数调用 - 它在***中的痛苦。 (托管c ++更容易使用)(#2)

  • 可以从c ++ / com创建appDomain。您只需调用ICorRuntimeHost :: CreateDomain。最有趣的是,加载到该appdomain中的程序集不会被visual studio识别为程序集,那些程序的调试符号不可用,并且断点不起作用。您可以在汇编代码中间中断执行。

  • 可以将#2与#1一起使用 - 但是 - Assembly.Load将因错误而无法工作:" hr 0x80131019:尝试使用fixups加载无法验证的可执行文件(IAT超过2个部分或TLS部分。)",并使用Assembly.LoadFrom将再次锁定您的DLL。

  • 最后可以使用#2 + Assembly.Load,但作为可加载项目使用基于C#的项目(没有IAT表) - 那么你最终可以分配第二个appDomain,并开始组装从那里。我已经对此进行了原型设计,我将其添加为答案 - 但是有没有更简单的方法?

在没有IAT表的情况下无法构建C ++程序集 - 至少在这里有一些关于提议的解决方案的提及:

how to build an executable without import table in c/c++?

但它看起来并不可行。

0 个答案:

没有答案