首页 > 解决方案 > Outlook 2016 VSTO-Addin:如何避免 System.AccessVioloationExceptionfor“过时”链接到 AppointmentItem?

问题描述

如您所见,我检查了约会项!= 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 我理解,对吧?

s

标签: outlook-addin

解决方案


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

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

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

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

有关损坏的进程状态异常的更多信息,请参阅 CLR Inside 博客中的条目处理损坏的状态异常

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

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

推荐阅读