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

我很確定的是,前天的時候我並沒有看到這個下載說明,當時下載 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 的一個坑

一些資料:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM