Я пытаюсь понять проблему, и хотя я много читал, я не могу найти никаких ресурсов, объясняющих эту странную комбинацию.
После нескольких экспериментов я обнаружил, чтокомбинации включения / выключения оптимизации компилятора и сборки для платформы AnyCPU / x86 изменяют поведение StackFrame.GetFileLineNumber ()
Я не понимаю, почему я получаю следующие результаты (в моей системе x64)
Optimisations | Platform | Line Number Reported | Result
-------------------|---------------|-----------------------|----------
off | anycpu | 10 | Correct
off | x86 | 10 | Correct
on | anycpu | APPCRASH | WTF?
on | x86 | 12 | WTF?
Приведенный ниже код воспроизводит проблему.
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
GetLineNumberOfThisCall();
Console.WriteLine("\r\nPress any key to exit...");
Console.ReadKey();
}
private static void GetLineNumberOfThisCall()
{
var stackTrace = new StackTrace(true);
var callingFrame = stackTrace.GetFrame(1);
Console.WriteLine("The call to the stack-walking method was found on line: {0}", callingFrame.GetFileLineNumber());
}
}
}
Если вы сохраните приведенный выше код как code.cs
, создайте пакетный файл с помощью следующего сценария, он легко скомпилирует сборкирепо к проблеме:
csc /t:exe /debug+ /out:anycpu-optimisation-on.exe /platform:anycpu /optimize+ code.cs
csc /t:exe /debug+ /out:anycpu-optimisation-off.exe /platform:anycpu /optimize- code.cs
csc /t:exe /debug+ /out:x86-optimisation-on.exe /platform:x86 /optimize+ code.cs
csc /t:exe /debug+ /out:x86-optimisation-off.exe /platform:x86 /optimize- code.cs