gpt4 book ai didi

c# - 从另一个 AppDomain 编码程序集

转载 作者:行者123 更新时间:2023-11-30 17:15:46 25 4
gpt4 key购买 nike

是否可以在不将该程序集加载到当前应用程序域的情况下保留对另一个应用程序域的程序集的引用?

我正致力于修复动态生成程序集并运行动态生成的代码的 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());
}

我想知道是否可以将动态生成的程序集加载到另一个应用程序域中,并通过某种类型的代理运行它们,而无需将其加载到当前应用程序域中。

编辑:

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

更新:

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

最佳答案

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

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

CreateMethod 而言,我认为您希望另一个程序集中的方法“包装”CreateMethod 并返回某种可以传递给 的标记运行。这几乎就像以某种方式更改签名...

关于c# - 从另一个 AppDomain 编码程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7772268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com