升級 Visual Studio 2015 CTP 5 的坑、坑、坑

前兩天,微軟發佈了 Visual Studio 2015 CTP 5,全稱爲 Visual Studio 2015 Community Technology Preview 5,意爲社區技術預覽版,之前的版本爲:Visual Studio 2015 Preview,多了一個 CTP,雖然都爲預覽版,但這次 CTP 的版本發佈,顯然離 VS2015 的正式版本發佈已經不遠了。

先貼一個重要鏈接:Visual Studio 2015 CTP 5 更新說明

上面的文章中詳細說明了 VS2015 各個版本更新內容,除了 VS2015 IDE 的發佈,微軟還發布了 ASP.NET 5 Beta2,信息量很大。

吐槽開始

前天的時候,根據上面文章中的鏈接地址,然後我就迫不及待的下載了,但下載之後發現是這個玩意:vs14.ctp_pro_enu.iso(4.38G),我當時沒怎麼注意,下載之後看一下名字爲 VS14,VS14 不是早就更名爲 VS2015 了嗎?後面還有一個 Pro(可以理解爲專業版),當時有很強烈的預感,我下錯了,果然,在安裝的時候就報錯了,說是已經安裝了什麼的,具體不記得詳細信息了,然後我就回過頭去找下載鏈接(已經過去了好幾個小時),確定就是這個版本的下載鏈接,難道是微軟的編輯把下載的鏈接地址搞錯了?後來去 MSDN 搜 VS2015 CTP 版本的下載地址,但是搜了好久,也沒找到,再後來就不了了之了。

奇怪的是,昨天的時候,無意間再去點擊 VS2015 CTP 版本說明的那篇文章,發現居然更新了東西,然後多了下面的下載內容:

211136418447572.png

我很確定的是,前天的時候我並沒有看到這個下載說明,當時下載 vs14.ctp_pro_enu.iso 的時候,是在版本說明中找到的下載鏈接,然後點擊上面的 Microsoft Visual Studio Ultimate 2015 CTP iso 下載地址,看到了下載內容名稱:vs2015.ctp_ult_enu.iso(4.81G),雖然又是四個多G,但看名字知道這次有譜了,心裏總算踏實了,又是幾個小時過去了。。。

終於下載好了,下面開始安裝:

211143015165197.png

211143068606629.png

又是幾個小時過去了。。。

在安裝過程中有一次報錯問題,當時沒來得及截圖,重新安裝就好了,好在 VS2015 可以記憶安裝狀態,重新安裝的話,可以接着之前的進行安裝,不需要重複安裝了,節約了很多的時間,安裝成功:

211150256252441.png

先說一下幾個變化,首先看一張圖:

211153383757127.png

如果你之前用過 VS2015 Preview 版本的話,應該會感覺有所不同,對,沒錯,.NET Framework 版本沒有了 4.5.3,增加了 .NET Framework 4.6,然後模版中的 ASP.NET Web Application 去掉了 vNext 的標籤,現在只有 ASP.NET 5 Class Library 和 ASP.NET 5 Console Application 還保留着,創建 ASP.NET Web Application 項目,之後的 Web 選擇項和之前的 VS2015 Preview 版本一樣,然後選擇 ASP.NET 5 Starter Web 選項進行創建。

在 ASP.NET 5 Beta2 更新說明 中(也就那幾個),最重要的就是 ASP.NET 5 項目(包含 Web、Class Library 和 Console Application)可以引用非 ASP.NET 5 類庫項目,說明:

Now, you can add a reference to a standard C# project.
(In previous releases, the Add Reference dialog only supported referencing other ASP.NET 5 projects.)

這對開發者非常重要,雖然知道微軟早晚會兼容,但 Preview 版本用於生產環境顯然是不行的,這次 CTP 版本是可以進行嘗試了,之前曾放棄 ASP.NET 5,很大一部分原因就是不能引用非 ASP.NET 5 類庫項目,那有人會說,你不能用 ASP.NET 5 Class Library 嗎?當然普通場景下是可以的,但 ASP.NET 5 Class Library 有個問題就是不能添加服務引用,比如你調用 WCF,這個在 ASP.NET 5 Class Library 項目中就不能實現,現在他們之間的類庫可以引用,那就可以進行實現了,服務引用用非 ASP.NET 5 類庫項目,然後再在 ASP.NET 5 Class Library 項目中進行引用它。

引用示意圖:

211215308916575.png

ClassLibrary1 爲 ASP.NET 5 Class Library 項目,ClassLibrary2 爲非 ASP.NET 5 Class Library 項目,需要注意的是 ClassLibrary2 不能引用 ClassLibrary1,另外,VS2015 CTP 版本中的 References 下面的圖標好像也變化了,ClassLibrary1 的 project.json 配置:

{
    "version": "1.0.0-*",
    "dependencies": {
    },
    "frameworks": {
        "aspnet50": {
            "dependencies": {
                "ClassLibrary2": "1.0.0-*"
            }
        },
        "aspnetcore50": {
            "dependencies": {
                "System.Runtime": "4.0.20-beta-22416"
            }
        }
    }
}

需要注意的是,之前我們在 ASP.NET 5 Class Library 項目中添加引用項,都是在 dependencies 節點中進行添加的,而添加非 ASP.NET 5 Class Library 項目的引用項,是在 frameworks 節點下的 dependencies 進行添加。

說到這,發現 VS2015 CTP 5 沒什麼坑啊,頂多是下載鏈接搞錯了,多花了幾個小時,確實是這樣,其實“坑”就一個,也是讓我非常“不爽”的地方。

用安裝成功的 VS2015 CTP 打開之前的項目,首先映入眼簾的是這樣:

211228336721087.png

什麼意思?上面有提到在 VS2015 CTP 中沒有了 .NET Framework 4.5.3(VS2015 Preview 中的版本),取而代之的是 .NET Framework 4.6,需要更改項目的 .NET Framework 版本,沒辦法,只能任由它更改了,另外,VS2015 CTP 也會時不時的給你冒出下面的“東西”:

211233274064690.png

太任性了,拿 VS2015 CTP 一點辦法都沒有,只能祈禱少遇到這個問題。

好了,更改爲 .NET Framework 版本後,重新編譯項目,出現了下面的這種情況:

211237274225484.png

當時,我和我的小夥伴都驚呆了,我滴媽媽呀,近 200 個錯誤,這是個什麼情況????

冷靜下來,查看具體錯誤信息,發現基本上都是字符串拼接的錯誤,示意代碼:

var fullName = "\{customer.FirstName} \{customer.LastName}";

這是 C# 6.0 中增加的語法特性,難道 VS2015 CTP 就不支持了?很不解,非常不解,這個問題困擾了我很久,我就差一點把 VS2015 CTP 給卸了,然後再重裝 VS2015 Preview,因爲新項目中大量用到了這個語法特性(寫起來非常方便),如果不支持的話,需要重新用 Format 實現,我的天哪,想想都是一件恐怖的事,而且項目中不只用到了這一個語法特性,還有很多,比如下面:

string[] names = new string[] { "Steve", null, "John" };
int length = names[1]?.Length ?? 0;

public string Location { get; set; } = "NYC";

但是,這些語法並沒有報錯,這就奇怪了,難道 VS2015 CTP 只移除了字符串拼接的語法?然後我就去找相關資料,又反覆看了 VS2015 CTP 中的版本說明,絲毫沒有找到有關 C# 6.0 語法特性更改的文字,最後無意間搜索到一篇文章:C# 6 PREVIEW: STRING INTERPOLATION

注意文章最後有個 Note 說明:

“Note: This describes the syntax that works in the Preview. However, we’ve decided to change the syntax, to even better match that of format strings. In a later release you’ll see interpolated strings written like this:”

var s = $"{p.Name,20} is {p.Age:D3} year`s` old";

微軟一句話,我們把特性更改了,怎麼了?此處略去1萬字的xxxxxxx。。。


其他不想說了,下面記錄下,如果你升級了 Visual Studio 2015 CTP 5 版本,你的項目需要做哪些調整:

1. targetFramework 版本更改

原來爲:

<system.web>
    <compilation targetFramework="4.5.3"/>
    <httpRuntime/>
</system.web>

更改爲(暫時未有 .NET Framework 4.6 下載,.NET Framework 4.6 Preview 實際版本爲 4.5.3):

<system.web>
    <compilation targetFramework="4.5"/>
    <httpRuntime/>
</system.web>

2. C# 6.0 語法特性-字符串拼接

var fullName = "\{customer.FirstName} \{customer.LastName}";

更改爲:

var fullName = $"{customer.FirstName} {customer.LastName}";

3. C# 6.0 語法特性-引用靜態類

using System.Math;

更改爲:

using static System.Math;

其他暫時未發現,歡迎補充。

哎,要改代碼了,此處再略去1萬字的xxxxxxx。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章