C# 如何在.NETCore2.0中捕获AccessViolationException
我有一个针对.Net framework 4.0和.Net core 2.0的.Net应用程序,我必须使用pkcs11interop库调用某些pkcs11驱动程序,因为我在.Net framework 4.0中遇到了一些驱动程序问题,我可以使用属性C# 如何在.NETCore2.0中捕获AccessViolationException,c#,C#,我有一个针对.Net framework 4.0和.Net core 2.0的.Net应用程序,我必须使用pkcs11interop库调用某些pkcs11驱动程序,因为我在.Net framework 4.0中遇到了一些驱动程序问题,我可以使用属性[HandleProcessCorruptedStateExceptions]处理该问题但这在.Net core 2.0中不起作用。在.Net core 2.0中如何处理 根据注释,我添加了环境变量 但仍然无法捕获异常。请注意以下事项: 你不应该。访问
[HandleProcessCorruptedStateExceptions]处理该问题
但这在.Net core 2.0中不起作用。在.Net core 2.0中如何处理
根据注释,我添加了环境变量
但仍然无法捕获异常。请注意以下事项: 你不应该。访问冲突是一个严重的问题:它是一个 意外尝试写入(或读取)无效内存 地址。正如John已经澄清的那样,非托管DLL可能已经 在访问冲突发生之前已损坏进程内存 提高。这可能会对电流的任何部分产生不可预测的影响 过程 最安全的做法是通知用户,然后 立即退出 更多细节:访问冲突是操作系统异常(所谓的 SEH或结构化异常处理异常)。这是一个不同的例子 与来自的托管CLR异常不同的异常类型
系统异常
。您很少会看到SEH的例外情况
托管代码,但如果出现,例如在非托管代码中,CLR将
将其交付给托管代码,您也可以在其中捕获
it1
然而,捕捉SEH异常通常不是一个好主意。进一步的
详细内容在MSDN杂志上的文章中进行了解释,其中包含以下内容
发件人:
CLR始终使用与程序本身引发的异常相同的机制向托管代码传递SEH异常。只要代码不试图处理它无法合理处理的异常情况,这就不是问题。大多数程序在访问冲突后无法安全地继续执行。不幸的是,CLR的异常处理模型总是鼓励用户通过允许程序捕获System.exception层次结构顶部的任何异常来捕获这些严重错误。但这很少是正确的做法
1在.NET 3.5之前都是这样。在.NET4中,行为已被更改。如果您仍然希望能够捕获此类异常,则必须将legacyCorruptedStateExceptionsPolicy=true
添加到app.config。更多详情请参阅上面链接的文章
也就是说,关于这件事,有一个很好的问题和答案,可能也适合你的情况
在.Net内核中处理损坏的状态异常时存在差异
请参考这篇关于.Net Core中的错误处理的文章,它使用中间件(这是我在使用扩展方法以满足您的需要时所喜欢的)。如果可以使用CSE,您将遇到硬崩溃。未来的黑暗时期 按时间顺序 dotnet/coreclr:剥离损坏的状态异常处理 dotnet/coreclr:不支持属性HandleProcessCorruptedStateExceptions dotnet/coreclr:无法在托管代码中捕获从本机Linux代码引发的任何用户异常 索尔现在。
必须创建非托管包装以捕获外部CSE。将环境变量“COMPlus_legacyCorruptedStateExceptionsPolicy”设置为“1”,即使在.NET Core中也会有所帮助。例如,使用
Environment.SetEnvironmentVariable(“COMPlus_legacyCorruptedStateExceptionsPolicy”,“1”)代码>,或在启动应用程序之前。尽管除了记录和退出异常后的进程之外,做任何其他事情都不是一个好主意。我尝试在环境.SetEnvironmentVariable(“COMPlus_legacyCorruptedStateExceptionsPolicy”,“1”)中添加这一行代码>program.cs main(),但它没有捕获异常。当应用程序已经启动时,这样做可能太晚了。在启动之前,请尝试设置此环境变量。我的应用程序是一个在客户端运行的自托管应用程序,我正在为它进行SCD部署。我如何处理此问题。只需使用适合于运行它的操作系统的方式设置环境变量,然后执行dotnet YourApp.dll
或以任何方式启动应用程序即可。