如何在.net core 2.0中捕获AccessViolationException

时间:2018-03-19 07:07:14

标签: c#

我有一个.Net应用程序我同时针对.Net framework 4.0和.Net core 2.0,由于一些驱动程序问题,我必须使用pkcs11interop库调用一些pkcs11驱动程序 AccessViolation异常在.net framework 4.0中,我能够在方法上处理属性[HandleProcessCorruptedStateExceptions],但这不适用于.Net core 2.0如何处理.Net core 2.0

根据评论,我添加了环境变量Environment variable

但仍然无法捕获异常。enter image description here

2 个答案:

答案 0 :(得分:2)

请注意以下事项:

  

你不应该。访问冲突是一个严重的问题:它是一个   意外尝试写入(或读取)无效的内存   地址。正如约翰已经澄清的那样,非托管DLL可能已经存在   在访问冲突之前已损坏进程内存   提高。这可能会对电流的任何部分产生不可预测的影响   过程

     

最安全的做法是尽可能通知用户   马上离开。

     

更多细节:访问冲突是操作系统异常(所谓的   SEH或结构化异常处理异常)。这是一个不同的   比托管CLR例外的那种例外   System.Exception。您很少会纯粹看到SEH异常   托管代码,但如果发生,例如在非托管代码中,CLR会   将它传递给您也能够捕获的托管代码   它 1

     

但是,捕获SEH例外通常不是一个好主意。进一步   详细信息在MSDN杂志的文章Handling Corrupted State Exceptions中进行了解释,其中包含以下文本   从:

     

CLR始终使用与程序本身引发的异常相同的机制向托管代码提供SEH异常。只要代码不尝试处理无法合理处理的异常条件,这就不是问题。在访问冲突后,大多数程序无法安全地继续执行。不幸的是,CLR的异常处理模型总是鼓励用户通过允许程序捕获System.Exception层次结构顶部的任何异常来捕获这些严重错误。但这很难做到。

1 直到.NET 3.5才这样。在.NET 4中,行为已被更改。如果您仍希望能够捕获此类异常,则必须将legacyCorruptedState­­ExceptionsPolicy=true添加到a​​pp.config。以上链接的更多细节。

尽管如此,关于可能适合您案件的问题,还有一个很好的问题和答案here

在.Net Core中处理损坏的状态异常存在差异。

请参阅这篇关于.Net Core中错误处理的article,它使用中间件(我喜欢使用扩展方法来满足您的需求)。

答案 1 :(得分:1)

如果可以使用自定义搜索引擎,则将导致严重崩溃。黑暗时代到来。

按时间顺序...

dotnet / coreclr Issue #9045:剥离损坏的状态异常处理

dotnet / coreclr PR #10957:不遵守属性HandleProcessCorruptedStateExceptions

dotnet / coreclr Issue #19192:无法捕获托管代码中从本地Linux代码抛出的任何用户异常

SOL当前。 必须创建各种非托管包装来捕获外部CSE。