首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卸载混合模式组件

卸载混合模式组件
EN

Stack Overflow用户
提问于 2016-10-27 19:55:33
回答 1查看 496关注 0票数 0

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

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

一旦C#程序集加载到尽可能少的源代码行,有人能提出一种发布它的方法吗?

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

  • 可以创建托管.dll并使用C++/cli在appDomain中执行任何操作,但是一旦使用了C++ / cli,.dll就变成了load (不能释放)。(#1)
  • 可以根本不使用托管C++,但使用本地C++ / COM技术使用CLRCreateInstance、GetRuntime、GetInterface连接函数调用。依此类推--但接下来您要处理的是相当复杂的c++ / com类。只是连接一个函数调用-这是痛苦的*。(托管c++更容易使用) (#2)
  • 可以从appDomain / com创建c++。您只需调用ICorRuntimeHost::CreateDomain。最有趣的是,加载到该应用程序域中的程序集不被visual studio识别为程序集,用于这些应用程序域的调试符号不可用,断点也无法工作。您可以在程序集代码中间中断执行。
  • 与#1一起使用#2是可能的--但是-- Assembly.Load将因错误而无法工作:"hr 0x80131019 :尝试用补丁加载不可验证的可执行文件(IAT具有多个部分或TLS部分。)“,使用Assembly.LoadFrom将再次锁定您的dll。
  • 最后,可以使用#2 + Assembly.Load,但是作为可加载的项目,可以使用基于C#的项目(这没有IAT表)--然后您可以最终分配第二个appDomain,然后从那里开始组装。我已经给它做了原型,我会添加它作为一个答案--但是没有更简单的方法吗?

C++程序集不可能在没有IAT表的情况下构建--至少在这里,有人提到了建议的解决方案:

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

但这看上去并不是可行的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2022-10-12 20:17:06

嗯..。6年后,我找到了这样做的解决方案:

https://github.com/tapika/dllloader

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40293194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档