前兩天,微軟發布了 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 版本說明的那篇文章,發現居然更新了東西,然后多了下面的下載內容:

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


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

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

如果你之前用過 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 項目中進行引用它。
引用示意圖:

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 打開之前的項目,首先映入眼簾的是這樣:

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

太任性了,拿 VS2015 CTP 一點辦法都沒有,只能祈禱少遇到這個問題。
好了,更改為 .NET Framework 版本后,重新編譯項目,出現了下面的這種情況:

當時,我和我的小伙伴都驚呆了,我滴媽媽呀,近 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。。。
后續:再次記錄 Visual Studio 2015 CTP 5 的一個坑
一些資料:
- Visual Studio 2015 CTP fixed bugs and known issues
- Visual Studio 2015 CTP 5
- .NET Web Development and Tools Blog
- Making It Better: Updates for ASP.NET 5 in Visual Studio 2015 CTP 5
- How to enable C# 6.0 feature in Visual Studio 2013?
- C# 6 PREVIEW: STRING INTERPOLATION
- Primary constructors no longer compile in VS2015
- .NET Framework and .NET SDKs