年老力衰,熱血只能花在刀口上,在技術領域嚐鮮當先鋒少不了要走冤枉路,有時更會先鋒變先烈,老年人歲月寶貴,嗯湯呀嗯湯,也因此,從不覺得自己會這麼早接觸.NET Core專案… 萬萬沒想到,今天糊里糊塗地上梁山一遊,解除了「使用Visual Studio編譯與偵錯.NET Core專案」的成就。
遇上棘手的Dapper問題,想要追進原始碼一探究竟。從Github下載了Dapper專案,用Visual Studio 2015開啟Dapper.sln,看到Solution Explorer畫面當場傻眼:
除了Dapper.StrongName,所有專案都呈現「load failed」,Output視窗則出現以下訊息。
E:\dapper-dot-net-master\Dapper.Contrib\Dapper.Contrib.xproj : error : The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. E:\dapper-dot-net-master\Dapper.Contrib\Dapper.Contrib.xproj
.xproj是.NET Core專案的專案檔,相當於原本的.csproj,換句話說,為求跨平台,Dapper已轉用.NET Core專案。
爬文得知,要在Visual Studio編譯.NET Core專案,必須升級到VS2015 Update 3,並安裝NET Core 1.0.0 - VS 2015 Tooling Preview 2(參考)
裝好.NET Core VS 2015 Tooling,重新開啟Dapper.sln,便可順利開啟專案及編譯。
下個問題來了,我原本寫好的Console Application專案(.csproj)可以直接參照Dapper專案(.xproj)進行逐行偵錯嗎?
答案是不行!csproj與xproj編譯原理不同,即使將兩種專案加入同一個解決方案,csproj的參照來源可以選取xproj專案,Reference也會出現Dapper項目並指向net451版dapper.dll,但編譯不會過,csproj專案抱怨不認得Dapper命名空間,形同未加參照。
爬文得知,兩種體系的專案不能直接參照,解決方法有二:參考
- 將xproj專案包成NuGet Package供csproj使用
- 將csproj轉成xproj
經評估,我的測試程式碼不多,新開一個專案比較快,以下是我的做法:
1.新増Console Application (.NET Core)專案
專案裡有個project.json,內含編譯目標平台等設定,新建專案預設為.NET Core:
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}
未修改設定前,安裝.NET 4版NuGet程式套件會出錯,例如:Oracle.ManagedDataAccess:
Errors in X:\WorkRoom\OracleTools\ConsoleApp1\ConsoleApp1.xproj
Package Oracle.ManagedDataAccess 12.1.24160419 is not compatible with netcoreapp1.0 (.NETCoreApp,Version=v1.0). Package Oracle.ManagedDataAccess 12.1.24160419 supports: net40 (.NETFramework,Version=v4.0)
One or more packages are incompatible with .NETCoreApp,Version=v1.0.
跟project.json完全不熟(好像也沒有熟的必要,依蒐集資訊,project.json即將消失,未來將回歸csproj),參考Dapper的project.json照方煎,修改加入"net451",專案切成.NET 4.5.1就能安裝ODP.NET了。
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Dapper": "1.50.2-*",
"Oracle.ManagedDataAccess": "12.1.24160419"
},
"frameworks": {
"net451": {
"frameworkAssemblies": {
"System.Data": "4.0.0.0",
"System.Xml": "4.0.0.0",
"System.Xml.Linq": "4.0.0.0"
}
}
}
}
後記:.NET Core 1.0雖已RTM,預估還需要一段時間才會成熟穩定,規格、做法應該還會有不少異動,這篇文章所提的東西或許很快就失效,大家加減參考吧~