C# 从另一个AppDomain封送程序集

C# 从另一个AppDomain封送程序集,c#,.net,c#-4.0,appdomain,.net-assembly,C#,.net,C# 4.0,Appdomain,.net Assembly,是否可以保留对来自另一个appdomain的程序集的引用,而不将该程序集加载到当前appdomain中 我正在修复Windows服务中的内存泄漏,该服务动态生成程序集并运行动态生成的代码。问题是生成的程序集已加载到当前应用程序域中,并且永远无法卸载 其中一个Windows服务库中有一个具有以下签名的方法: public Assembly CreateMethod(ObservableCollection<Field> sourceFields, Field destinationFi

是否可以保留对来自另一个appdomain的程序集的引用,而不将该程序集加载到当前appdomain中

我正在修复Windows服务中的内存泄漏,该服务动态生成程序集并运行动态生成的代码。问题是生成的程序集已加载到当前应用程序域中,并且永远无法卸载

其中一个Windows服务库中有一个具有以下签名的方法:

public Assembly CreateMethod(ObservableCollection<Field> sourceFields, Field destinationField)
稍后,CreateMethod中的此程序集引用用于在生成的程序集中运行函数

public object Run(Field destinationField, ObservableCollection<LinkField> sourceLinkFields, DataRow mainRow, Assembly script) {

   ...

   var method = script.GetStaticMethodWithArgs("*.a" + Id.ToString().Replace("-", String.Empty), argumentTypes.ToArray());

   return method(arguments.ToArray());
}
公共对象运行(字段destinationField、ObservableCollection sourceLinkFields、DataRow mainRow、程序集脚本){
...
var method=script.GetStaticMethodWithArgs(“*.a”+Id.ToString().Replace(“-”,String.Empty),argumentTypes.ToArray());
返回方法(arguments.ToArray());
}
我想知道是否有可能将动态生成的程序集加载到另一个应用程序域中,并通过某种类型的代理运行它们,而不将其加载到当前的应用程序域中

编辑:

我想知道当程序集加载到另一个AppDomain中时,是否可以在一个AppDomain中使用
程序集
类引用。查看MSDN文档,它们展示了如何使用MarshallByRefObject。基本上,我试图避免更改CreateMethod函数的签名,但是如果不可能,我可能需要更改它以返回MarshallByRefObject

更新:


最后,我在另一个应用程序域中调用了CSScript.LoadMethod,在该域中我保存了一个字典,然后我让CreateMethod返回一个Guid而不是程序集,然后我将这个Guid传递到运行调用。运行调用现在将Guid作为参数而不是程序集。在运行调用中,我将Guid传递给另一个应用程序域,运行该方法,并通过继承MarshalByRefObject的类返回结果对象。

这是应用程序的主要功能之一!只需查看文档

如果您不想在主AppDomain中使用动态程序集,则必须将
CreateMethod
移动到另一个AppDomain,因为只要有
assembly
的实例,它就会被加载。换句话说,不可能在另一个应用程序域中保存对程序集的引用,而只能跨应用程序域调用该程序集

在不更改签名和一堆代码的情况下,似乎需要移动最小数量:1)程序集创建和2)
Run
。然后让
的实现运行
整理结果


至于
CreateMethod
,我想您需要另一个程序集中的一个方法来“包装”
CreateMethod
,并返回某种可以传递给
Run
的令牌。这几乎就像在某种程度上更改签名…

请参见示例:感谢链接,我已经用一些其他细节更新了问题。我仍然不清楚我是否需要将CreateMethod的签名更改为MarshallByRefObject,或者我是否可以将返回类型保留为AssemblyType,以便将来帮助他人,我想知道:您以前是否看过
AppDomain
的文档?谢谢,这是我最终采用的方法。我不得不更改CreateMethod并运行方法签名,但仍然能够保持代码的原始设计。
public object Run(Field destinationField, ObservableCollection<LinkField> sourceLinkFields, DataRow mainRow, Assembly script) {

   ...

   var method = script.GetStaticMethodWithArgs("*.a" + Id.ToString().Replace("-", String.Empty), argumentTypes.ToArray());

   return method(arguments.ToArray());
}