我打算將之前研究用 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

不算笨問題,就真的是沒碰就不會知道的事情

Post a comment