Outlook 2016 VSTO-Addin:如何避免“过时”链接到AppointmentItem的System.AccessVioloationException?

问题描述 投票:0回答:1

您可以看到我检查了约会项!= 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
1个回答
0
投票

当我通过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在运行时在调用堆栈中查找应用程序域中的异常处理程序之前在托管代码中引发异常时触发。
© www.soinside.com 2019 - 2024. All rights reserved.