如果我将两个应用程序加载到同一个 AppDomain 中,我可以与另一个托管应用程序交互吗?
Posted
技术标签:
【中文标题】如果我将两个应用程序加载到同一个 AppDomain 中,我可以与另一个托管应用程序交互吗?【英文标题】:Can I interact with another managed application if I load both applications into the same AppDomain? 【发布时间】:2012-01-11 21:37:39 【问题描述】:我编写了一个应用程序,该应用程序旨在扩展现有程序。但是,所述程序不允许任何加载扩展/插件的方法,或者任何你会调用它们的方法。出于这个原因,我一直在考虑几种可能性,其中包括注入 C++ DLL 并为之疯狂,但我更感兴趣的是在托管 C# 中完成整个事情。
目标程序和我自己的程序都是用 C# 编写的,因此是受管理的。现在,我知道一个事实,如果我在自己的项目中设置对目标程序的引用,我可以在 Visual Studio 编辑器中“访问”它的属性、字段等,但是我永远无法获得“真实的" 来自这些值,因为我无法在读取其成员时运行目标程序,这意味着我无法从中获取任何“真实世界”数据。
我的想法是这样的:如果我要创建一个启动器,它将一个 DLL(C++,但那将是唯一的 C++ 部分)注入到设置 AppDomain 的目标进程中,将主机进程放置在该 AppDomain 中,然后继续将我的程序加载到同一个进程和 AppDomain 中,我是否能够访问目标程序的“实时”值?
我知道这是一个很长的尝试,实际上测试这需要几天甚至几周的编码。这就是我在这里问的原因;也许这有点太不正统和牵强,但我认为这实际上有可能奏效。理论上。
所以,简化一点:将DLL注入目标进程->创建AppDomain->将宿主进程放入AppDomain->将MyProgram.exe加载到进程和AppDomain中->访问目标进程的方法和属性
【问题讨论】:
你跳过了一步——“你的程序”将如何执行?为什么你的代码会被调用? 您是否尝试过编写一个小应用程序,调用其他应用程序的静态 main(string[] args) 方法,然后启动一个线程通过 GC 和反射遍历引用? @JohnSaunders 我的本地 DLL 加载我的应用程序并运行它,我认为这部分不应该是瓶颈。还有丹尼·瓦罗德,我没有,但我会调查一下。谢谢! 【参考方案1】:我不确定我是否理解您真正想要做的事情,但如果您要做的是在一个应用程序和另一个将在同一台机器上运行的应用程序之间交换数据,那么为什么不使用 WCF 通信使用IPC 绑定(由NetNamedPipeBinding
类提供)。我相信这比您建议的解决方案更合理、更易于维护和测试。
【讨论】:
以上是关于如果我将两个应用程序加载到同一个 AppDomain 中,我可以与另一个托管应用程序交互吗?的主要内容,如果未能解决你的问题,请参考以下文章
当我将 html 数据从字符串加载到 webview 时,Jquery 功能不起作用