草庐IT

c# - AppDomain,处理异常

coder 2024-05-21 原文

我正在开发一个大型应用程序,其中包含许多较小的插件/应用程序。

它们不够大,不能成为一个完整的进程,但又太小,无法在线程中、在一个进程下运行,而且我希望它基于插件。 如果该插件的更新版本可用,则应将其卸载、更新并重新启动。

在我寻找解决方案的过程中,我偶然发现了神奇的词 AppDomain,我引用了:

"Use application domains to isolate tasks that might bring down a process. If the state of the AppDomain that's executing a task becomes unstable, the AppDomain can be unloaded without affecting the process. This is important when a process must run for long periods without restarting. You can also use application domains to isolate tasks that should not share data."

这正是我想要的。但是,我猜他们的“状态变得不稳定”与我的观点不同。我正在考虑一个问题,其中一个插件出于某种原因抛出异常。我希望它能被捕获、通过电子邮件发送、卸载并重新启动(如果可能)。

因此,我创建了一个应用程序,该应用程序启动后会在其文件夹中查找所有 .dll。检查 dll 是否包含插件。为该插件创建一个新的 AppDomain,一旦加载了所有内容,它将启动每个插件。 (其中每个插件可以包含多个线程,并排在一起愉快地共存)。

所以我还在那里添加了一个超时,它会在 5 秒后触发以抛出一个新的 Exception();在 AppDomain 上添加了一个 UnhandledException 事件来处理它。但是,它捕获了它,并且在 cathing 之后,仍然“崩溃”了整个过程,包括所有额外的子 AppDomains。

但它在引文中明确指出“隔离‘可能’导致流程中断的任务”。所以我错过了一些重要的东西吗?我对这句话的看法有误吗?

最佳答案

自 .NET 2.0 以来 unhandled exceptions crash the process .来自 AppDomain.UnhandledException事件文档:

This event provides notification of uncaught exceptions. It allows the application to log information about the exception before the system default handler reports the exception to the user and terminates the application.

AppDomain.FirstChanceException 也是如此:

This event is only a notification. Handling this event does not handle the exception or affect subsequent exception handling in any way.

您需要考虑如何处理异常,就像在普通应用中一样。仅使用 AppDomains 无济于事。如果在给定的 AppDomain 中未处理异常,它将在调用 AppDomain 时重新抛出,直到它得到处理或使进程崩溃。处理 some 完全没问题异常,不要让它们使您的进程崩溃。

AppDomain 是程序集和内存(不是线程)的逻辑容器。 AppDomain 的隔离意味着:

  • 在域 A 中创建的对象不能被域 B 直接访问(没有编码(marshal)处理)。这允许在不影响域 B 中的任何内容的情况下卸载域 A。当“拥有”域被卸载时,这些对象将被自动删除。

  • 可以使用 AppDomain 自动卸载程序集。这是从进程中卸载托管 dll 的唯一方法。这对于 DLL 热插拔很有用。

  • AppDomain 的安全权限和配置可以与其他 AppDomain 隔离。当您加载不受信任的第三方代码时,这会很有帮助。它还允许您覆盖程序集的加载方式(版本绑定(bind)、卷影复制等)。

使用 AppDomain 的最常见原因是当您运行不受信任的第三方代码时。或者您有非托管代码并且想要托管 CLR 或需要 dll 热插拔。我认为在CLR hosting情景你can save your process当第三方代码抛出未处理的异常时崩溃。

此外,您可能还想看看 System.Addin or MEF,而不是滚动自己的基础设施。 .

关于c# - AppDomain,处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071957/

有关c# - AppDomain,处理异常的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  3. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  4. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  5. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  8. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  9. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  10. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

随机推荐