C#/WinRT 可讓使用 .NET 的開發人員使用類別庫專案,在 C# 中撰寫自己的 Windows 運行時間元件。 撰寫的元件可以在原生桌面應用程式中使用,作為套件參考,或者在經過一些修改後作為專案參考。
本教程將示範如何使用 C#/WinRT 建立簡單的 Windows 執行階段元件,將元件分發為 NuGet 套件,並從 C++/WinRT 控制台應用程式使用元件。 如需提供本文程序代碼的完整範例,請參閱 C#/WinRT 撰寫範例。 如需撰寫相關的詳細資訊,請參閱 撰寫元件。
如需使用 C#/WinRT 撰寫 WinUI 控件以特別用於 Windows App SDK 應用程式的逐步解說,請參閱本文 逐步解說:使用 WinUI 3 控件撰寫 C# 元件,並從 C++ Windows App SDK 應用程式取用
先決條件
本逐步解說需要下列工具和元件:
- Visual Studio 2022
- .NET 6.0 SDK 或更新版本
- C++/WinRT VSIX C++/WinRT 項目範本
使用 C#/WinRT 建立簡單的 Windows 執行時間元件
從在Visual Studio中建立新項目開始。 選取 類別庫 專案範本,並將專案命名為 AuthoringDemo。 您必須對項目進行下列新增和修改:
TargetFramework更新 AuthoringDemo.csproj 檔案中的 ,並將下列元素新增至PropertyGroup:<PropertyGroup> <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework> <Platforms>x64</Platforms> </PropertyGroup>若要存取 Windows 執行時間類型,您必須在 TFM 中設定特定的 Windows SDK 版本。 如需支援版本的詳細資訊,請參閱 .NET 6 和更新版本:使用 TFM 選項。
在您的專案中安裝 Microsoft.Windows.CsWinRT NuGet 套件。
一。 在 [方案總管] 中,於專案節點上按一下滑鼠右鍵,然後選擇 [管理 NuGet 套件]
。 b。 搜尋 Microsoft.Windows.CsWinRT NuGet 套件並安裝最新版本。 本教學使用 C#/WinRT 版本 1.4.1。
新增設定
PropertyGroup屬性的新CsWinRTComponent元素。 這會指定您的專案是 Windows 執行時間元件,.winmd以便在建置項目時產生檔案。<PropertyGroup> <CsWinRTComponent>true</CsWinRTComponent> </PropertyGroup>如需 C#/WinRT 專案屬性的完整清單,請參閱 C#/WinRT NuGet 檔。
您可以使用庫
.cs類別檔案來撰寫執行時類別。 以滑鼠右鍵按下Class1.cs檔案,並將重新命名為Example.cs。 將下列程式代碼新增至這個檔案,將公用屬性和方法新增至運行時間類別。 請記得將您要在執行時間元件中公開的任何類別標示為public。namespace AuthoringDemo { public sealed class Example { public int SampleProperty { get; set; } public static string SayHello() { return "Hello from your C# WinRT component"; } } }您現在可以建置項目來產生
.winmd元件的檔案。 以滑鼠右鍵按兩下 [方案總管] 中的項目,然後按兩下 [建置]。 您會在組建輸出資料夾中看到產生的 AuthoringDemo.winmd檔案。
為這個元件產生 NuGet 套件
大部分的開發人員都想將其 Windows 運行時元件散布及共享成 NuGet 套件。 另一個選項是取用元件做為項目參考。 下列步驟示範如何封裝 AuthoringDemo 元件。 當您產生封裝時,C#/WinRT 會配置套件中的元件與承載組件,以啟用原生應用程式的取用。
有數種方式可以產生 NuGet 套件:
如果您想要在每次建置項目時產生 NuGet 套件,請將下列屬性新增至 AuthoringDemo 專案檔,然後重建專案。
<PropertyGroup> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> </PropertyGroup>或者,您可以在 [方案總管] 中,以滑鼠右鍵按兩下
AuthoringDemo 項目,然後選取 [ 套件] ,以產生 NuGet 套件。
當您編譯套件時,[編譯] 視窗應該會顯示已成功建立 NuGet 套件 AuthoringDemo.1.0.0.nupkg。 如需使用 .NET CLI 的 NuGet 套件屬性的詳細資訊,請參閱 使用 dotnet CLI 建立套件。
從 C++/WinRT 應用程式取用元件
C#/WinRT 撰寫的 Windows 執行階段元件可以從任何 Windows 執行階段(WinRT)相容的語言取用。 下列步驟示範如何在 C++/WinRT 控制台應用程式中呼叫上述撰寫的元件。
備註
可透過套件參考或專案參考來支援從 C#/.NET 應用程式取用 C#/WinRT 元件。 此案例相當於取用任何一般 C# 類別庫,而且在大部分情況下不會牽涉到 WinRT 啟用。 從 C#/WinRT 1.3.5 開始,C# 開發人員的專案參考需要 .NET 6。
將新的 C++/WinRT 控制台應用程式 專案新增至您的解決方案。 請注意,如果您選擇此專案,也可以是不同解決方案的一部分。
一。 在 [方案總管]中,以滑鼠右鍵按兩下您的方案節點,然後按兩下 [新增 ->[新增專案]。
b。 在 [ 新增專案] 對話框中,搜尋 C++/WinRT 控制台應用程式 專案範本。 選取範本,然後按 下一步。
丙. 將新專案命名為 CppConsoleApp,然後點擊 建立。
將 AuthoringDemo 元件的參考新增至 NuGet 套件或專案參考。
選項 1 (套件參考):
一。 滑鼠右鍵按一下
CppConsoleApp 專案,然後選擇 [管理 NuGet 套件]。 您可能需要設定套件來源,以添加對 AuthoringDemo NuGet 套件的引用。 若要這樣做,請按兩下 NuGet 套件管理員中的 [設定 ] 圖示,並將套件來源新增至適當的路徑。
b。 設定套件來源之後,請搜尋
AuthoringDemo 套件,然後點擊 [安裝]。
選項 2 (項目參考):
一。 以滑鼠右鍵按兩下 CppConsoleApp 項目,然後選取 [新增 ->參考]。 在 [專案] 節點下,新增對 AuthoringDemo 項目的參考。
若要裝載元件,您必須新增一個用於可啟用類別註冊的組態檔。 如需受控元件裝載的詳細資訊,請參閱 受控元件裝載。
一。 若要新增指令清單檔,請再次以滑鼠右鍵點擊專案,然後選擇 [新增] ->[新增項目]。 搜尋 文字檔 範本,並將它命名為 CppConsoleApp.exe.manifest。 貼上下列內容,這些內容使用可啟動類別註冊項目來指定執行階段類別:
<?xml version="1.0" encoding="utf-8"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="CppConsoleApp"/> <file name="WinRT.Host.dll"> <activatableClass name="AuthoringDemo.Example" threadingModel="both" xmlns="urn:schemas-microsoft-com:winrt.v1" /> </file> </assembly>未封裝的應用程式需要應用程式指令清單檔。 針對已封裝的應用程式,應用程式取用者必須在其
Package.appxmanifest套件指令清單檔案中註冊可啟動的類別,如 逐步解說:使用 WinUI 3 控件建立 C# 元件,並從 C++ Windows App SDK 應用程式取用中所述。b。 修改專案,以在部署專案時將指令清單檔包含在輸出中。 點選 [方案總管
] 中的 CppConsoleApp.exe.manifest 檔案,並將 [Content ] 屬性設定為True 。 以下是其外觀的範例。
在專案的頭檔底下開啟 pch.h ,並新增下列程式代碼行以包含您的元件。
#include <winrt/AuthoringDemo.h>開啟 專案 來源檔案底下的main.cpp,並將它取代為下列內容。
#include "pch.h" #include "iostream" using namespace winrt; using namespace Windows::Foundation; int main() { init_apartment(); AuthoringDemo::Example ex; ex.SampleProperty(42); std::wcout << ex.SampleProperty() << std::endl; std::wcout << ex.SayHello().c_str() << std::endl; }建置並執行 CppConsoleApp 專案。 您現在應該會看到下列輸出。