访问违规在奇怪的情况下抛出异常

本文关键字:情况下 抛出异常 访问 | 更新日期: 2023-09-27 18:33:04

我在c#中工作了很长时间,但我从未遇到过这种错误。首先,您是否看到这个代码块有任何错误(可能是错误的((当然,除了它的逻辑,我知道它总是返回 0(?

public static int GetDecimals(MySimpleEnum val)
    {
        int result = 0;
        switch (val)
        {
            case MySimpleEnum.Base:
            case MySimpleEnum.Slow:
            case MySimpleEnum.Normal:
            case MySimpleEnum.Quick:
            case MySimpleEnum.Fastest:
                result = 0;
                break;
        }            
        return result;        
    }

发布项目设置:调试常量 = 假;跟踪常量 = 真;优化代码 = 真;输出/高级/调试信息 = 无;

IIS = 版本 7.5

此方法具有指定的发布设置,将引发">系统.访问违规异常:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

这是有趣的部分。这些情况,当它不引发此异常时:

  1. 在IIS(Express和非Express(8.5上运行它(无需编辑项目(。
  2. 设置优化代码 = false; 和输出/高级/调试信息 = 假;
  3. 将方法包装在里面以尝试/捕获块(尝试也使用catch块中的log4net记录异常 - 空日志(
  4. 将方法的内部替换为一些不同的代码。

注意事项:

  • 必须使用服务器上的 win 调试器捕获异常(否调用常规 .NET 异常处理程序(
  • 异常后应用程序崩溃。
  • 这个代码块在几个月前就已经运行了(很长一段时间没有发布(。该错误可能始于一些更新。
  • 在两台不同的 IIS 7.5 服务器和一台装有 IIS 8.5 和 IIS Express (VS2012( 的计算机上进行测试。相同的结果。
  • 我已经尝试了很多不同的项目设置组合。基本上,如果我没有像第 2 点那样设置设置,它会抛出IIS 7.5 上的异常。
  • 我的工作(和构建(计算机正在运行具有最新更新的 Windows 8.1。
  • 代码块位于单独的项目(类库(中。

我知道如何解决这个问题。但我不喜欢关闭问题,同时不知道原因。另外,我想在将来避免这种情况。你觉得你能帮我吗?如果是一些空引用异常,为什么会发生这种情况?为什么它是特定于调试/发布或特定于 IIS 版本的?

*注2

最近我在发布时遇到了缺少dll(System.Net.Http.Formatting.dll,System.Web.Http.dll,System.Web.Http.WebHost.dll(的问题。这是因为一些Microsoft安全更新。也许这是类似的东西。

编辑 1添加枚举声明的结构。

public enum MySimpleEnum
    {
        Base = 0,
        Slow = 1,
        Normal = 2,
        Quick = 3,
        Fastest = 4
    }

另外,我只是尝试添加[MethodImpl(MethodImplOptions.NoInlineing(],但没有帮助。

访问违规在奇怪的情况下抛出异常

托管代码中出现这些类型的访问冲突错误是不典型的。它们来自内存损坏,这可能表明硬件有故障 - 在极少数情况下,这表明 CLR 本身存在错误。

此类错误的最可能原因来自其他地方,例如,如果此代码以某种方式使用本机代码 - 在不安全的上下文中调用本机代码或从本机代码调用。

引用 MSDN AccessVirelationException:

在完全由可验证的托管代码组成的程序中,所有引用要么有效,要么为 null,并且不可能发生访问冲突。仅当可验证的托管代码与非托管代码或不安全的托管代码交互时,才会发生访问违规异常。

在任何情况下,您通常需要在代码中的其他位置查找损坏内存的错误代码。不幸的是,这是一个很难解决的问题。祝你好运!

我不确定这是否仍然与您相关,但我设法通过在完全托管的代码部分中简单地更改一个非常小且微不足道的布尔值来生成此 AccessViolation 错误。但是,最好的部分是,如果我在该子项目的编译器中禁用代码优化,则一切运行良好。这似乎是编译器在非常特殊的情况下引入的错误,不需要任何逻辑意义。