我已经学习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;
}
释放项目设置:DEBUG常量=false; TRACE常量=true; 优化代码=true; 输出/高级/调试信息=无; IIS=版本7.5
指定了释放设置的此方法会抛出“System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”。
有趣的部分在于,在以下情况下它不会抛出此异常:
1. 在IIS(Express和非Express)8.5上运行(不需要进行项目编辑)。 2. 将Optimize code=false;和Output/Advanced/Debug info=false; 3. 将方法包装在try/catch块内(还尝试使用catch块中的log4net记录异常-空日志)。 4. 用一些不同的代码替换方法的内部。
请注意以下几点:
1. 必须使用win调试器在服务器上捕获异常(没有调用常规.NET异常处理程序) 2. 应用程序在异常后崩溃。 3. 这个代码块几个月前就开始运作了(很长时间没有发布)。该错误可能随着某些更新而开始。 4. 在具有IIS 7.5和具有IIS 8.5和IIS Express(VS2012)的一个机器上测试。相同的结果。 5. 我尝试了许多不同的项目设置组合。基本上,如果我不像第2点那样设置设置,则会在IIS 7.5上引发异常。 6. 我的工作(和构建)机器正在运行最新更新的Windows 8.1。 7. 该代码块位于单独的项目(类库)中。
我知道如何解决这个问题。但是,我不喜欢在不知道原因的情况下关闭问题。而且,我想避免在将来发生这种情况。如果它是一些空引用异常,为什么会发生这种情况?为什么它与调试/发布特定或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.NoInlining)],但没有帮助。