年老力衰,熱血只能花在刀口上,在技術領域嚐鮮當先鋒少不了要走冤枉路,有時更會先鋒變先烈,老年人歲月寶貴,嗯湯呀嗯湯,也因此,從不覺得自己會這麼早接觸.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命名空間,形同未加參照。

爬文得知,兩種體系的專案不能直接參照,解決方法有二:參考

  1. 將xproj專案包成NuGet Package供csproj使用
  2. 將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" 
      } 
    } 
  } 
}
如此,Console Application成功參照Dapper專案,也順利鑽進Dapper原始碼開始逐行偵錯,.NET Core技能點數+0.5。

後記:.NET Core 1.0雖已RTM,需要一段時間才會成熟穩定,規格、做法預期還會有不少異動,文章所提的東西或許會失效,大家加減參考吧~


Comments

# by 凱大

我覺得dotnet core還滿值得看的 裡面提到的許多概念和想法 都是可以在其他地方自行重新實作的

# by Sam Lin

project.json might come back. " I would not even be surprised if we even bring back- maybe we do keep a project.json, and it only works in limited scenarios. If that's what people want, we'll entertain that idea." -- Scott Hunter, dotnetConf 2016 Day 1 Keynote 12m24s

Post a comment