Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NETCore2.0中捕获AccessViolationException_C# - Fatal编程技术网

C# 如何在.NETCore2.0中捕获AccessViolationException

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中如何处理 根据注释,我添加了环境变量 但仍然无法捕获异常。请注意以下事项: 你不应该。访问

我有一个针对.Net framework 4.0和.Net core 2.0的.Net应用程序,我必须使用pkcs11interop库调用某些pkcs11驱动程序,因为我在.Net framework 4.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中,行为已被更改。如果您仍然希望能够捕获此类异常,则必须将
legacyCorruptedState­ExceptionsPolicy=true
添加到app.config。更多详情请参阅上面链接的文章

也就是说,关于这件事,有一个很好的问题和答案,可能也适合你的情况

在.Net内核中处理损坏的状态异常时存在差异


请参考这篇关于.Net Core中的错误处理的文章,它使用中间件(这是我在使用扩展方法以满足您的需要时所喜欢的)。

如果可以使用CSE,您将遇到硬崩溃。未来的黑暗时期

按时间顺序

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

dotnet/coreclr:不支持属性HandleProcessCorruptedStateExceptions

dotnet/coreclr:无法在托管代码中捕获从本机Linux代码引发的任何用户异常

索尔现在。
必须创建非托管包装以捕获外部CSE。

将环境变量“COMPlus_legacyCorruptedState­ExceptionsPolicy”设置为“1”,即使在.NET Core中也会有所帮助。例如,使用
Environment.SetEnvironmentVariable(“COMPlus_legacyCorruptedState­ExceptionsPolicy”,“1”),或在启动应用程序之前。尽管除了记录和退出异常后的进程之外,做任何其他事情都不是一个好主意。我尝试在
环境.SetEnvironmentVariable(“COMPlus_legacyCorruptedState­ExceptionsPolicy”,“1”)中添加这一行program.cs main(),但它没有捕获异常。当应用程序已经启动时,这样做可能太晚了。在启动之前,请尝试设置此环境变量。我的应用程序是一个在客户端运行的自托管应用程序,我正在为它进行SCD部署。我如何处理此问题。只需使用适合于运行它的操作系统的方式设置环境变量,然后执行
dotnet YourApp.dll
或以任何方式启动应用程序即可。