C#/WinRT 使使用 .NET 的开发人员能够使用类库项目在 C# 中创作自己的 Windows 运行时组件。 已创作的组件可以在原生桌面应用程序中作为包引用使用,或通过一些修改作为项目引用使用。
本演练演示如何使用 C#/WinRT 创建简单的 Windows 运行时组件,将组件分发为 NuGet 包,以及从 C++/WinRT 控制台应用程序中使用该组件。 有关提供本文代码的完整示例,请参阅 C#/WinRT 创作示例。 有关创作的更多详细信息,请参阅 创作组件。
有关如何使用 C#/WinRT 编写专用于 Windows 应用 SDK 应用程序的 WinUI 控件的演练,请参阅文章 演练:使用 WinUI 3 控件创作 C# 组件,并从 C++ Windows 应用 SDK 应用程序中调用
先决条件
本演练需要以下工具和组件:
- Visual Studio 2022
- .NET 6.0 SDK 或更高版本
- 适用于 C++/WinRT 项目模板的 C++/WinRT VSIX
使用 C#/WinRT 创建简单的 Windows 运行时组件
首先在 Visual Studio 中创建新项目。 选择 类库 项目模板,并将项目命名为 AuthoringDemo。 需要对项目进行以下添加和修改:
更新
TargetFramework文件中的 ,并将以下元素添加到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 包。
a。 在解决方案资源管理器中,右键单击项目节点并选择“ 管理 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 控制台应用程序 项目添加到解决方案。 请注意,如果选择此选项,此项目也可以是其他解决方案的一部分。
a。 在解决方案资源管理器中,右键单击解决方案节点,然后单击“添加新>项目”。
b. 在 “添加新项目”对话框中,搜索 C++/WinRT 控制台应用程序项目 模板。 选择模板并单击 下一步。
选项c. 将新项目命名 为 CppConsoleApp ,然后单击“ 创建”。
将 AuthoringDemo 组件添加为引用,可以是 NuGet 包或者项目引用。
选项 1(软件包引用):
a。 右键单击 CppConsoleApp 项目,然后选择“ 管理 NuGet 包”。 您可能需要配置您的包源,以便添加对 "AuthoringDemo" NuGet 包的引用。 为此,请单击 NuGet 包管理器中的 “设置” 图标,并将包源添加到相应的路径。
b. 配置包源后,搜索 AuthoringDemo 包,然后单击“ 安装”。
选项 2 (项目参考):
a。 右键单击 CppConsoleApp 项目,然后选择 添加 ->引用。 在 项目 节点下,添加对 AuthoringDemo 项目的引用。
若要托管组件,需要添加清单文件以用于可激活的类注册。 有关托管组件管理的更多详细信息,请参阅 托管组件管理。
a。 若要添加清单文件,请再次右键单击项目,然后选择“ 添加 -> 新建项”。 搜索 文本文件 模板并将其命名为 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 应用 SDK 应用程序中使用。b. 修改项目,以在部署项目时将清单文件包含在输出中。 在解决方案资源管理器 中单击
CppConsoleApp.exe.manifest 文件,并将内容 属性设置为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 项目。 现在应会看到以下输出。