在没有将该程序集加载到当前应用程序域中的情况下,是否可以从另一个应用程序域中持有一个程序集的引用?
我正在修复一个 Windows 服务中的内存泄漏问题,该服务动态生成程序集并运行动态生成的代码。问题在于,生成的程序集被加载到当前应用程序域中后无法卸载。
在其中一个 Windows 服务库中有一个具有以下签名的方法:
public Assembly CreateMethod(ObservableCollection<Field> sourceFields, Field destinationField)
这种方法创建汇编代码,并使用CSScript库的LoadMethod函数加载它:
result = CSScript.LoadMethod(scriptFunction.ToString());
后来,使用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());
}
我想知道是否可以将动态生成的程序集加载到另一个应用程序域中,并通过某种类型的代理运行它们,而无需将其加载到当前应用程序域中。
编辑:我想知道当程序集加载在另一个应用程序域中时,是否可以在一个应用程序域中使用
Assembly
类引用。从MSDN文档上看,他们展示了如何使用MarshalByRefObject。基本上,我试图避免更改CreateMethod函数的签名,但如果不可能,我可能需要将其更改为返回MarshalByRefObject。更新:最终,我把对CSScript.LoadMethod的调用放在了另一个应用程序域中,我在那里保留了一个字典。然后我将CreateMethod的返回值从Assembly更改为Guid,然后我将这个Guid传递到Run调用中。现在,Run调用以Guid作为参数,而不是Assembly。在Run调用内部,我将Guid传递给另一个应用程序域,运行该方法,并通过继承MarshalByRefObject的类返回结果对象。