使用Visual Studio編譯及偵錯.NET Core專案

年老力衰,熱血只能花在刀口上,在技術領域嚐鮮當先鋒少不了要走冤枉路,有時更會先鋒變先烈,老年人歲月寶貴,嗯湯呀嗯湯,也因此,從不覺得自己會這麼早接觸.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,需要一段時間才會成熟穩定,規格、做法預期還會有不少異動,文章所提的東西或許會失效,大家加減參考吧~

歡迎推文分享:
Published 19 August 2016 10:32 PM 由 Jeffrey
Filed under: ,
Views: 7,704



意見

# 凱大 said on 19 August, 2016 02:47 PM

我覺得dotnet core還滿值得看的

裡面提到的許多概念和想法

都是可以在其他地方自行重新實作的

# Sam Lin said on 01 September, 2016 03:49 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<August 2016>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication