【笨問題】在 .NET 類別程式庫專案引用 ASP.NET Core API
1 |
我打算將之前研究用 Minimal API 寫桌面小工具的設計包成元件,把自動尋找可用 HTTP Port 跟啟動時帶出預設瀏覽器、網頁關閉自動結束等機制包成擴充函式加入網站,未來 Program.cs 加一行 app.RunAsDesktopTool();
即可取代原本查詢 URL、 啟動瀏覽器、處理 Server Sent Event、心跳監控自動結束的一百多行程式碼,要寫單檔式網頁介面小工具就簡單多了。
新建好 .NET 6 Class Library 專案,搬入相關程式碼,我卻遇到一個笨問題 - 不知要怎麼在類別程式庫專案引用 Microsoft.AspNetCore.* 相關 API。
.NET Core 3 起改變做法,原本要透過 NuGet 下載的 ASP.NET Core 等基本程式庫,被包進 Project SDK,例如:一般 Console 專案用 Microsoft.NET.Sdk、網站專案用 Microsoft.NET.Sdk.Web、Worker Service 專案用 Microsoft.NET.Sdk.Worker... 等等。可省去參照一堆 NuGet 套件的麻煩,而專案需選擇一種 Project SDK,宣告在 csproj 第一行 Project 元素的 Sdk Attribute:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Class Library 專案使用 Microsoft.NET.Sdk,但會用到 ASP.NET Core 的 WebApplication 等型別,我用傳統思維,由 F12 查到 WebApplication 隸屬 Microsoft.AspNetCore.dll:
想必就是要參照 Microsoft.AspNetCore,於是下了 dotnet add package Microsoft.AspNetCore 加入參照,NuGet 套件順利安裝,但編譯還是不過,仔細看才發現不對勁,怎麼是 2.2 版?
折騰了一陣子,我才理解到,.NET Core 3 起,非網站專案要參照 Microsoft.AspNetCore 不是這樣裝滴。不是 PackageReference,要用 FrameworkReference 加入 Microsoft.AspNetCore.App 參考:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>
再學到一則實戰小技巧。
Tips of adding reference to Microsoft.AspNetCore.* library in .NET 6 class library.
Comments
# by sholfen
不算笨問題,就真的是沒碰就不會知道的事情