我有一个.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
答案 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中,行为已被更改。如果您仍希望能够捕获此类异常,则必须将legacyCorruptedStateExceptionsPolicy=true
添加到app.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。