如何在新的 AppDomain 中运行从加载到引用的程序集的方法

Posted

技术标签:

【中文标题】如何在新的 AppDomain 中运行从加载到引用的程序集的方法【英文标题】:How to run method from assembly loaded to references, in new AppDomain 【发布时间】:2015-07-28 21:19:27 【问题描述】:

最近我发现运行编译为 .exe 的方法的几个实例比在 f.e 中运行相同的方法更快。几个新任务。我不知道这是否适用于所有方法,但它适用于从 API 获取数据。

我在网上搜索以找到解决方法。我得到了在新 appDomains 中尝试运行方法的答案。所以我用我想要运行的方法创建 .exe 程序集(它是控制台应用程序)。我通过右键单击“引用”->“添加引用”来加载它。我可以通过 exeName.ClassName.Method(params) 轻松访问该方法。问题是我不知道如何在新的 appDomains 中运行这些方法。我在网上找到的每个答案都是按路径加载的程序集。

除了创建 AppDomain 之外,我也会很高兴得到答案。我只是想将数据传递给这个方法并得到结果。

TL;DR:在 Parallel.For(0,4,i=> method()) 中运行的方法比在已编译的 .exe 文件的 4 个实例中运行相同的方法慢。

【问题讨论】:

您想在不同的进程中运行您的方法吗?或在不同的应用程序域中。 我不在乎,只要我可以将对象发送到方法并获得结果。我听说过管道,但我找不到简单的教程来运行我的 method.exe 的几个实例并获得响应。 【参考方案1】:

您可以使用使用 IPC 协议的多进程架构或将您的方法托管在不同的域中。在这两种情况下,我都建议通过 wcf 进行 .net 远程处理,因为您将为两种方法编写几乎相同的代码,并且因为要与托管在同一进程中的另一个应用程序域中的类进行对话,.net 远程处理是唯一的方法(可悲的是,对于许多人来说开发人员,但不适合我)。但我几乎可以肯定,通常这不会比仅仅创建一些线程并将它们称为异步更快。域间/进程间通信必须依赖消息序列化/反序列化,这会增加巨大的开销,特别是在方法调用本身非常轻量的情况下。

【讨论】:

【参考方案2】:

经过一番研究和询问,我找到了解决方案:

var ad = AppDomain.CreateDomain("mydomain");
ad.DoCallBack(() =>
            
                //stuff to do
            

在将数据传递到新的 AppDomain 时可能会出现一些问题。对我来说最简单的方法是:

ad.SetData("key", value);

并在 AppDomain 中检索:

var value = (valueType)AppDomain.CurrentDomain.GetData("key");

【讨论】:

以上是关于如何在新的 AppDomain 中运行从加载到引用的程序集的方法的主要内容,如果未能解决你的问题,请参考以下文章

无法在新的 appDomain 中加载程序集

在新的 AppDomain 中加载插件

在新的 appdomain 中加载 C 模块失败

在新的 Appdomain 中加载程序集,需要完全信任父程序集

在运行时从另一个 AppDomain 调试动态加载的 DLL

Log4net 可以在新创建的 AppDomain 中运行吗