.NET Native 优化破坏应用程序
.NET Native optimization breaks an application
在其中一个应用程序中,我遇到了与代码优化相关的错误。
我试图在测试应用程序中重复此行为。该应用程序可用于 GitHub:https://github.com/altk/NullableError
该错误仅在使用.NET Native 编译时出现,但并非所有地方都出现。错误在几台 PC 上重现。
应用代码非常简单。它必须打印到控制台:
----------------否则-------------
-------------- 成功 --------------
但由于优化的原因,它打印:
----------------否则-------------
-------------- 失败 --------------
应用的所有代码:
#define DEBUG
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace NullableError
{
sealed partial class App
{
private readonly Dictionary<String, String> _dictionary = new Dictionary<String, String>();
public App()
{
InitializeComponent();
Execute();
Exit();
}
private Int64? NullableInt64
{
get
{
var resultString = this[nameof(NullableInt64)];
return String.IsNullOrEmpty(resultString) ? default(Int64?) : Int64.Parse(resultString);
}
//-----FIX VARIANT------
//UNCOMMENT NEXT LINE TO FIX
//[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
set
{
//-----FIX VARIANT------
//REPLACE WITH
//this[nameof(NullableInt64)] = value != null ? value.Value.ToString() : null;
this[nameof(NullableInt64)] = value?.ToString();
}
}
private Int64? AnotherNullableInt64
{
get
{
var resultString = this[nameof(AnotherNullableInt64)];
return String.IsNullOrEmpty(resultString) ? default(Int64?) : Int64.Parse(resultString);
}
set { this[nameof(AnotherNullableInt64)] = value?.ToString(); }
}
private void Execute()
{
//-----FIX VARIANT------
//REPLACE WITH IF-ELSE WITH
//NullableInt64 = (DateTimeOffset.Now - DateTimeOffset.MinValue).TotalMilliseconds < 0 ? (Int64?) 125 : null;
if ((DateTimeOffset.Now - DateTimeOffset.MinValue).TotalMilliseconds < 0)
{
Debug.WriteLine("-------------- IF --------------");
NullableInt64 = 125;
}
else
{
Debug.WriteLine("-------------- ELSE --------------");
NullableInt64 = null;
}
//-----FIX VARIANT------
//REPLACE WITH
//AnotherNullableInt64 = 0;
AnotherNullableInt64 = null;
Debug.WriteLine(String.Format("-------------- {0} --------------", this[nameof(NullableInt64)] == "0" ? "FAIL" : "SUCCESS"));
}
private String this[String key]
{
get
{
String result;
return _dictionary.TryGetValue(key, out result) ? result : null;
}
set { _dictionary[key] = value; }
}
}
}
Microsoft 确认了此错误。
https://connect.microsoft.com/VisualStudio/feedback/details/2164313/net-native-optimization-breaks-an-application#
它将在即将推出的 VS 2015 更新 2 中修复
在其中一个应用程序中,我遇到了与代码优化相关的错误。
我试图在测试应用程序中重复此行为。该应用程序可用于 GitHub:https://github.com/altk/NullableError
该错误仅在使用.NET Native 编译时出现,但并非所有地方都出现。错误在几台 PC 上重现。
应用代码非常简单。它必须打印到控制台:
----------------否则-------------
-------------- 成功 --------------
但由于优化的原因,它打印:
----------------否则-------------
-------------- 失败 --------------
应用的所有代码:
#define DEBUG
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace NullableError
{
sealed partial class App
{
private readonly Dictionary<String, String> _dictionary = new Dictionary<String, String>();
public App()
{
InitializeComponent();
Execute();
Exit();
}
private Int64? NullableInt64
{
get
{
var resultString = this[nameof(NullableInt64)];
return String.IsNullOrEmpty(resultString) ? default(Int64?) : Int64.Parse(resultString);
}
//-----FIX VARIANT------
//UNCOMMENT NEXT LINE TO FIX
//[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
set
{
//-----FIX VARIANT------
//REPLACE WITH
//this[nameof(NullableInt64)] = value != null ? value.Value.ToString() : null;
this[nameof(NullableInt64)] = value?.ToString();
}
}
private Int64? AnotherNullableInt64
{
get
{
var resultString = this[nameof(AnotherNullableInt64)];
return String.IsNullOrEmpty(resultString) ? default(Int64?) : Int64.Parse(resultString);
}
set { this[nameof(AnotherNullableInt64)] = value?.ToString(); }
}
private void Execute()
{
//-----FIX VARIANT------
//REPLACE WITH IF-ELSE WITH
//NullableInt64 = (DateTimeOffset.Now - DateTimeOffset.MinValue).TotalMilliseconds < 0 ? (Int64?) 125 : null;
if ((DateTimeOffset.Now - DateTimeOffset.MinValue).TotalMilliseconds < 0)
{
Debug.WriteLine("-------------- IF --------------");
NullableInt64 = 125;
}
else
{
Debug.WriteLine("-------------- ELSE --------------");
NullableInt64 = null;
}
//-----FIX VARIANT------
//REPLACE WITH
//AnotherNullableInt64 = 0;
AnotherNullableInt64 = null;
Debug.WriteLine(String.Format("-------------- {0} --------------", this[nameof(NullableInt64)] == "0" ? "FAIL" : "SUCCESS"));
}
private String this[String key]
{
get
{
String result;
return _dictionary.TryGetValue(key, out result) ? result : null;
}
set { _dictionary[key] = value; }
}
}
}
Microsoft 确认了此错误。 https://connect.microsoft.com/VisualStudio/feedback/details/2164313/net-native-optimization-breaks-an-application#
它将在即将推出的 VS 2015 更新 2 中修复