【问题标题】:Outlook 2016 VSTO-Addin: How to avoid System.AccessVioloationExceptionfor "outdated" link to AppointmentItem?Outlook 2016 VSTO-Addin:如何避免 System.AccessVioloationExceptionfor“过时”链接到 AppointmentItem?
【发布时间】:2020-05-08 01:34:17
【问题描述】:

如您所见,我检查了约会项目!= null 和 rtfBody.Length != 0 尽管对约会项.GetInspector 的调用会引发 System.AccessVioloationException。 当我通过 VisualStudio 运行 Outlook 插件较长时间(几个小时)然后关闭 Outlook 时,就会发生这种情况。 我的想法是,这是由于 Outlook 已经关闭,因此 AppointmentItem 仍然存在,但一些与 COM 相关的东西出现故障。但这只是一个模糊的猜测。 您知道为什么会发生这种情况以及如何避免这种情况吗?

此外,我已经添加了一个 try/catch,例如:

catch (Exception ex)
{
   log.Info(ex.Message);
   return 0;
} 

但是异常没有被捕获。所以我需要另外明确地捕获 SystemExceptions,对吧?

【问题讨论】:

    标签: outlook-addin


    【解决方案1】:

    当我通过 VisualStudio 运行 Outlook 插件较长时间(几个小时)然后关闭 Outlook 时,会发生这种情况。

    公共语言运行时通过称为运行时可调用包装器 (RCW) 的代理公开 COM 对象。尽管 RCW 对 .NET 客户端来说似乎是一个普通对象,但它的主要功能是编组 .NET 客户端和 COM 对象之间的调用。因此,如果 COM 服务器不存在(Outlook 已关闭),您对 RCW 的调用就没有任何意义。

    默认情况下,从 .NET 4.0 开始,公共语言运行时 (CLR) 不会将这些异常传递给托管代码,并且不会为它们调用 try/catch 块(和其他异常处理子句)。如果您绝对确定要保持对这些异常的处理,则必须将HandleProcessCorruptedStateExceptionsAttribute 属性应用于要执行其异常处理子句的方法。 CLR 仅在同时具有 HandleProcessCorruptedStateExceptionsAttributeSecurityCriticalAttribute 属性的方法中将损坏的进程状态异常传递给适用的异常子句。

    您还可以将<legacyCorruptedStateExceptionsPolicy> 元素添加到应用程序的配置文件中。这将确保在没有HandleProcessCorruptedStateExceptionsAttributeSecurityCriticalAttribute 属性的情况下将损坏的状态异常传递给您的异常处理程序。此配置元素对在 .NET Framework 4 之前的版本中编译但在 .NET Framework 4 或更高版本中运行的应用程序没有影响;将继续为这些应用程序提供损坏的状态异常。 HandleProcessCorruptedStateExceptionsAttribute 属性在部分受信任或透明代码中遇到时会被忽略,因为受信任的主机不应允许不受信任的加载项捕获并忽略这些严重异常。

    有关损坏的进程状态异常的详细信息,请参阅 CLR Inside 博客中的条目 Handling Corrupted State Exceptions

    您还可以处理AppDomain类的以下事件:

    • AppDomain.UnhandledException 在未捕获到异常时触发。从 .NET Framework 4 开始,不会针对破坏进程状态的异常(例如堆栈溢出或访问冲突)引发此事件,除非事件处理程序对安全至关重要并且具有 HandleProcessCorruptedStateExceptionsAttribute 属性。
    • AppDomain.FirstChanceException 在托管代码中引发异常时触发,然后运行时在调用堆栈中搜索应用程序域中的异常处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多