文章出處

(2015年8月5日更新:微軟已經修復了Roslyn的這個bug,詳見 https://github.com/dotnet/roslyn/pull/4303

昨天,我們用VS2015編譯了博客程序中的一個程序集并發布上線。

今天有園友反饋向我們反饋,個人博客分頁顯示隨筆列表的頁面中,“上一頁”“下一頁”顯示亂碼:

而這個地方的“上一頁”“下一頁”字符串恰恰是在我們昨天發布的程序集中定義的:

public class Pager : Control
{
    protected string PreviousText = "上一頁";
    protected string NextText = "下一頁";

    //...
}

可是昨天我們并沒有更改這部分代碼,肯定不是我們昨天代碼修改引起的。

于是,我們改用VS2013重新編譯了一下這個程序集,更新之后,亂碼立馬消失。

接著,用ILSpy反編譯了VS2015所編譯出的程序集的IL代碼之后,真相大白:

public class Pager : Control
{
    protected string PreviousText = "ÉÏÒ»Ò³";
    protected string NextText = "ÏÂÒ»Ò³";
    //...
}

原來是VS2015所用的編譯器惹的禍,而這個編譯器就是大名鼎鼎的 Roslyn

大家使用 Visual Studio 2015 時需要注意一下這個問題。

【補充】

用ildasm查看VS2015編譯出來的程序集的IL代碼(亂碼):

.maxstack  2
IL_0000:  ldarg.0
IL_0001:  ldstr      bytearray (C9 00 CF 00 D2 00 BB 00 D2 00 B3 00 ) 
IL_0006:  stfld      string BlogServer.Web.Controls.Pager::PreviousText
IL_000b:  ldarg.0
IL_000c:  ldstr      bytearray (CF 00 C2 00 D2 00 BB 00 D2 00 B3 00 ) 
IL_0011:  stfld      string BlogServer.Web.Controls.Pager::NextText

用ildasm查看VS2013編譯出來的程序集的IL代碼(未亂碼):

.maxstack  2
IL_0000:  ldarg.0
IL_0001:  ldstr      bytearray (0A 4E 00 4E 75 98 )                               // .N.Nu.
IL_0006:  stfld      string BlogServer.Web.Controls.Pager::PreviousText
IL_000b:  ldarg.0
IL_000c:  ldstr      bytearray (0B 4E 00 4E 75 98 )                               // .N.Nu.
IL_0011:  stfld      string BlogServer.Web.Controls.Pager::NextText

【問題原因與臨時解決方法】

在GitHub上提交Issue之后,從回復中得知這個問題與Roslyn檢測文件編碼的處理方式有關。

查看出現亂碼問題的.cs文件編碼,發現用的是ANSI編碼。于是以UTF-8編碼另存該文件,然后用VS2015重新編譯,問題解決。

VS2015 RC中沒這個問題。

【GitHub上的相關鏈接】

* VS2015打開非unicode編碼的代碼,其中變量名有中文就無法編譯的bug

* .NET compiler produces incorrect string constants in MSIL when C# source files encoded with non-UTF-8 encoding

* VS2015 (MSBuild/14) compiler can't detect file ecoding correctly

* Chinese string is compiled to garbage characters

* Roslyn can't detect 932 encoding


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()