[英]Windows update corrupts struct construction in .Net 4.x
自從14.9.2017安裝Windows更新以來,我們在發布版本中創建某些結構時遇到了問題。 我注意到沒有更新的計算機上的編譯代碼按預期運行(“錯誤的啟動:1.1.1990 ...”),在安裝了相關更新的計算機上,代碼無法正常工作(“錯誤的啟動:1.1。 2000 ...“)。 從版本4.x開始,所有版本的.NET框架都會發生這種情況。
class Program
{
static void Main(string[] args)
{
DateTime start1 = new DateTime(1990, 1, 1, 6, 0, 0);
DateTime end1 = new DateTime(2000, 1, 1, 6, 0, 0);
var r2 = new DateTimeRange(start1, end1);
var r3 = new Range<DateTime>(r2.From, r2.To);
Console.WriteLine($"Wrong start: {r3.From}, correct start: {start1}");
Console.ReadLine();
}
}
public struct DateTimeRange
{
private Range<DateTime> m_range;
public DateTimeRange(DateTime from, DateTime to)
{
m_range = new Range<DateTime>(from, to);
}
public DateTime From
{
get { return m_range.From; }
}
public DateTime To
{
get { return m_range.To; }
}
}
public struct Range<T> where T : struct
{
private T m_from;
private T m_to;
public Range(T from, T to)
{
m_from = from;
m_to = to;
}
public T From
{
get { return m_from; }
}
public T To
{
get { return m_to; }
}
}
重新啟動機器后,我看到了它。 肯定會像更新中的bug那樣嘎嘎作響。 在我的機器上,我看到C:\\ Windows \\ Microsoft.NET \\ Framework64 \\ v4.0.30319 \\ corjit.dll,日期為9/6/17,上午9:23 CDT,版本4.7.2110.0。
該錯誤特定於x64抖動,僅在啟用了優化程序的Release版本中發生。 它匹配我之前在抖動中看到的那種錯誤,過去大多數優化錯誤都與代碼處理結構有關。
不幸的是,我很難描述錯誤,代碼生成太強大了,我發現的解決方法似乎沒有在機器代碼中乍看之下產生足夠的差異。 但是否則是繞過這些優化器錯誤的典型方式:
using System.Runtime.CompilerServices;
...
public DateTime From {
[MethodImpl(MethodImplOptions.NoInlining)]
get { return m_range.From; }
}
其他解決方法是強制32位模式或回退到傳統抖動 。 請報告錯誤,以便他們可以修復它,如果您不想花時間讓我知道,我會照顧它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.