Tag: appdomain

是否可以在C#类中为多个计时器设置一个Exception处理程序?

我有一个C#程序,它运行一个系统托盘应用程序 – 在后台传输/移动/创建/编辑文件。 如果用户手册删除了程序正在使用的文件,则有很多exception处理和循环处理可以防止程序崩溃/卡住。 不幸的是,程序运行的计算机之一是程序崩溃。 计算机很难获得,并且无法加载调试软件(它是一台没有网络访问权限的嵌入式PC)。 我已经尝试找到崩溃的原因(例如未处理的exeption)但是没有找到任何东西,并且无法访问PC,因为它位于远程位置。 我希望找到一种方法来使用AppDomain / UnhandledExceptionEventHandler来捕获所有未处理的exception并将其记录下来进行诊断。 但是,我(在故意)在类“DoSomething.class”中的办公室中创建的exception正在崩溃WinForm应用程序而不是记录exception错误。 我的代码是: //Current domain for the unhandled exception handling AppDomain currentDomain; [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)] public MainForm() { InitializeComponent(); currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler); CreateTimer.Interval = Settings.Default.CreateTimer; CreateTimer.Start(); RunCopyProtocol(); ChangeFilesTimer.Interval = 10000; ChangeFilesTimer.Start(); RunChangeFiles(); throw new Exception(“ABC”); } public void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs args) { […]

长时间运行的应用程序变慢

有一个由三个可执行文件组成的应用程序。 其中之一 – 调度程序,运行其他可执行文件。 调度程序在完成时从可执行文件接收代码。 也就是说,只有调度程序始终在运行,其他可执行文件会卸载并再次加载。 该应用程序在服务点运行并全天候工作。 在第一次启动时,应用程序运行得很快。 在一天结束时,应用程序运行速度非常慢。 这种行为可能是什么原因?

在.NET 4.0过程中创建.NET 2.0 AppDomain

我需要在.NET 4.0进程中动态创建.NET 2.0兼容程序集。 目前它是通过以下方式实现的: AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(…) ModuleBuilder mb = assemblyBuilder.DefineDynamicModule(…); 但不幸的是,所有生成的dll都是.NET 4.0(inheritance自我的4.0进程),这与我的其他.NET 2.0进程无关。 知道2个不同的CLR版本的AppDomain如何在同一个进程中共存?

为什么终结器中的AppDomain.Unload()错误?

这是一些示例代码: using System; namespace UnloadFromFinalizer { class Program { static void Main(string[] args) { Program p = new Program(); } AppDomain domain; Program() { this.domain = AppDomain.CreateDomain(“MyDomain”); } ~Program() { AppDomain.Unload(this.domain);//<– Exception thrown here } } } 我有一个类,它在构造函数中创建一个AppDomain,用于在对象的生命周期内使用。 我想正确清理AppDomain,所以我想我会在终结器中调用Unload。 不幸的是,这会导致抛出CannotUnloadAppDomainException。 AppDomain.Unload的MSDN文档说明: 在某些情况下,如果在终结器中调用,则调用Unload会导致立即的CannotUnloadAppDomainException。 为什么是这样? 是否已清除成员变量“domain”? 该清理是否自动包括卸载AppDomain,还是以某种无法访问的方式存在? 有什么我应该做的,或者我可以安全地转储终结器? (只要在此过程中完全清理了GC,我就不在乎GC何时清除了我的对象。)

当一个对象派生自MarshalByRefObject并且还标记为时会发生什么?

我正在研究我的第一个使用AppDomains的项目,我想知道当一个对象派生自MarshalByRefObject并且还标记为[Serializable]时会发生什么? 例如: [Serializable] public class DummyClass: MarshalByRefObject { }

如何检查AppDomain是否已卸载?

我通过代理在另一个AppDomain中使用了一堆对象。 它们位于一个单独的域中,因为我需要热交换包含这些对象的程序集,所以在我使用它托管的程序集完成后我卸载了一个AppDomain。 我想有时检查一下我是否已经卸载过去的AppDomain(或者它以某种方式单独卸载)以进行测试。 有没有办法做到这一点? 显而易见的方法是做一些会引发AppDomainUnloadedException事情,但我希望还有其他方法。

AppDomains与强大的服务器

经过一些研究后,AppDomains似乎并不是构建托管服务器的真正工具。 根据我的理解,如果在创建的AppDomain中存在未处理的exception(如果从创建的AppDomain中的线程抛出exception),托管服务器仍将崩溃。 因此,在这种情况下,如果托管服务器托管泄漏exception的服务,这也将导致默认的AppDomain失效。 所以我想从服务器架构的角度来看,没有比创建子进程和监视它们更好的了。 这是正确的还是我错过了AppDomains的东西? 谢谢,克里斯托夫

受限制的权限AppDomain Grant Set问题

我有一些代码可以动态地将Razor模板编译成一个程序集,我使用一组权限(无法访问文件等)执行。 这适用于我们的开发计算机和测试服务器(Windows 2008 IIS7 x64 .NET 4)。 但是在我们的生产服务器(相同规范)上,它给出了错误: “加载此程序集将从其他实例生成不同的授权集。(HRESULTexception:0x80131401)” 这是代码: – public static SandboxContext Create(string pathToUntrusted, List references) { AppDomainSetup adSetup = new AppDomainSetup(); adSetup.ShadowCopyFiles = “true”; var dir = new DirectoryInfo(pathToUntrusted); String tempPath = Path.Combine(Path.GetTempPath(), dir.Name + “_shadow”); adSetup.CachePath = tempPath; // Our sandbox needs access to this assembly. string AccessPath = Path.Combine(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, “bin\\CommonInterfaces.WebPages.dll”); […]

运行具有不同版本的依赖关系dll的插件的推荐方法是什么?

我有一个WCF插件服务,通过MEF加载插件并运行它们。 每个插件都是一个具有多个dll的目录,它实现了特定的接口。 我使用MEF( DirectoryCatalog )在同一个AppDomain中加载所有插件,并以通用方式运行它们(使用reflection)。 现在假设我有两个带有dll依赖项的插件: Plugin1 —-> Entities 1.0.0.1 Plugin2 —-> Entities 1.0.0.2 我在1.0.0.2中添加了一些新实体。 当我运行插件时,我得到一个偶然的错误,即新的实体在dll中不存在。 我猜错误发生,因为我在相同的AppDomain中运行代码,加载的第一个Entities.dll是将为我的所有插件提供服务的那个。 那么,如何在不创建新的appdomain的情况下运行隔离的每个插件? 有什么方法可以告诉MEF以某种方式加载所有插件依赖项? 我在网上看到了几个解决方案: 为每个插件创建一个新的appdomain – 我不想去那里 。 使用 – 当我第一次尝试它时,这不起作用,我不希望我的插件服务器更新每个程序集依赖项版本更改。 另外,我希望能够运行具有不同组件版本的插件。 用snk签署程序集 – 我还没有尝试这个,我不确定这个解决方案是否有效。 框架将如何知道他需要加载不同的程序集? 这与具有不同版本的程序集有何不同? 我是否需要以某种方式配置我的服务才能使其工作? 有没有人对我有更好的想法? 什么是运行隔离插件的推荐方法?

appdomain可以限制在一个目录中吗?

我正在开发一个插件主机。 插件应该具有他们需要的尽可能少的信任,但是我希望插件可以读取和写入文件。 可以将加载程序集的AppDomain限制为只能访问一个目录进行读写吗? 还可以理解其他选项和方法,例如将文件数据从主机流式传输到插件(读取)以及从插件传输到主机(写入)的简单方法。 如果相关:我正在使用MAF基础设施插件。 http://msdn.microsoft.com/en-us/library/bb384200.aspx