- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以在不将该程序集加载到当前应用程序域的情况下保留对另一个应用程序域的程序集的引用?
我正致力于修复动态生成程序集并运行动态生成的代码的 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/
我为 ReSharper 编写了 xunit.net 测试运行程序,但在 8.0 版本中遇到了一个问题 - 我看到程序集无法加载到影子复制的 AppDomain 中。相同的代码和测试项目在 7.1 版
我无法弄清楚有关我的 AppDomain.Unload(...) 调用的问题。我有来自 my earlier question 的代码的详细解释.事实证明,我执行了几个显然不需要的步骤。但是,我相当确
我想在应用程序域内运行第三方库(在本例中为 XSP),这样我就可以关闭它或以其他方式控制它的行为。 基本流程: var child = AppDomain.CreateDomain(...) ...
我正在尝试将一个 dll 加载到控制台应用程序中,然后将其卸载并完全删除该文件。我遇到的问题是,在其自己的 AppDomain 中加载 dll 的行为会在父 AppDomain 中创建一个引用,因此除
我的印象是 AppDomains 彼此隔离。似乎在 StackOverException 的情况下,情况并非如此。 为了演示这个问题,我创建了一个简单的控制台应用程序,其唯一目的是生成一个新的 App
我有一个带有服务器“AppDomain”的应用程序,它接受来自单独的 AppDomain 的调用(其中托管插件,由其他人开发且不值得信赖)。 从服务器 AppDomain 中,我需要知道哪个“插件”(
坐: 我正在从我的进程中创建子应用程序域以加载程序集。 我可以调用此 AppDomain。 我想将一个对象从我的默认进程 AppDomain 传递到这个新创建的 AppDomain,以接收从加载到新
可能是以下副本:Can I prevent an uncaught exception in another AppDomain from shutting down the application?
我已经在 Specflow 2.0、nUnit 3.X、TeamCity 和 Visual Studio 2013 中编写了自动化测试。我试图并行运行这些测试,但它们失败了,因为代码使用静态类/对象。
我有一个 Bootstrapper,它查看 ASP.NET MVC 应用程序中的所有程序集以查找实现 IBootstrapperTask 接口(interface)的类型,然后将它们注册到 IOC C
我有一个 .NET 应用程序,它创建多个单独的 AppDomain 来运行一些可插入代码,每个 AppDomain 都设置自己的 WCF 命名管道服务来与中央应用程序进行通信。 但是我想为每个应用程序
对于我的项目,我需要从其他 .Net 程序集访问资源,但我不想让它们加载,因为我可能会加载同一程序集的不同版本。 为此,我创建了另一个 AppDomain,我使用 CreateInstanceAndU
我正在使用 AppDomain 来加载程序集然后卸载它们。 但是,我遇到了一个非常奇怪的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被多次加载! 为什么有加载的程
假设我有 AppDomainA,它启动 AppDomainB。 AppDomainB 然后启动 AppDomainC。 如果在 AppDomainA 中卸载 AppDomainB,AppDomainC
是否可以通过它的“友好名称”或 ID 来引用现有的 AppDomain(不是由我的代码创建)?还是以其他方式? 最佳答案 List AppDomains in Process 关于.net - 如何通
我在同一个虚拟目录下有一个网站和一个 web 服务,一些网页调用了 web 服务。 调用 Web 服务时,IIS 是创建新的 AppDomain 还是在同一个 AppDomain 中运行 Web 服务
在 ASP.NET 3.5(带有 IIS6)中,是否为每个请求创建了 AppDomains?我知道所有应用程序在 w3wp.exe 下都有自己的 AppDomain,但是整个 AppDomain 究竟
我一直无法找到关于使用 AppDomains 时发生的事情的非常清楚的描述,所以希望有人能够启发我。我有一个简单的测试程序(基本上是扯掉了 MSDN example ): using System;
我仍在尝试了解持续存在的问题,但它几乎可以概括为无法卸载 AppDomain。 它发生在将 ASP.NET WebAPI 部署到 Azure 应用服务期间,我们观察到以下情况: 进程 ID 不会更改,
我已经编写了在所有专用服务器上运行的软件(C#.NET控制台应用程序),这些服务器将管理各个Java进程(启动/停止/重新启动它们)。我遇到的问题是,当我的应用程序崩溃时,它不会关闭它启动的Java子
我是一名优秀的程序员,十分优秀!