演练:创建 C#/WinRT 组件,并从 C++/WinRT 中调用它

使用 C#/WinRT,开发人员可以使用.NET在 C# 中使用类库项目创作自己的Windows 运行时组件。 编写的组件可以在本机桌面应用程序中使用,可以作为包引用或经过一些修改后作为项目引用。

本演练演示如何使用 C#/WinRT 创建简单的Windows 运行时组件,将组件分发为 NuGet 包,以及从 C++/WinRT 控制台应用程序中使用该组件。 有关提供本文代码的完整示例,请参阅 C#/WinRT 创作示例。 有关创作的详细信息,请参阅“创作组件”。

有关专门在 Windows 应用 SDK 应用程序中使用 C#/WinRT 创作 WinUI 3 控件的演练,请参阅文章 Walkthrough:使用 WinUI 控件创作 C# 组件并从 C++ Windows 应用 SDK应用程序使用

先决条件

本演练需要以下工具和组件:

使用 C#/WinRT 创建简单的Windows 运行时组件

首先在Visual Studio中创建新项目。 选择 Class Library project 模板,并将 project AuthoringDemo 命名。 需要对项目进行以下添加和修改:

  1. 更新 TargetFramework 文件中的 ,并将以下元素添加到 PropertyGroup中:

    <PropertyGroup>
        <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
        <Platforms>x64</Platforms>
    </PropertyGroup>
    

    若要访问Windows 运行时类型,需要在 TFM 中设置特定的Windows SDK 版本。 有关支持的版本的详细信息,请参阅 .NET 6 及更高版本:使用 TFM 选项

  2. 在你的项目中安装 Microsoft.Windows.CsWinRT NuGet 包。

    a。 在解决方案资源管理器中,右键单击项目节点,然后选择 Manage NuGet 包

    b. 搜索 Microsoft.Windows。CsWinRT NuGet 包并安装最新版本。

  3. 添加一个新 PropertyGroup 元素,用于设置 CsWinRTComponent 属性。 这指定项目是Windows 运行时组件,以便在生成项目时生成 .winmd 文件。

    <PropertyGroup>   
        <CsWinRTComponent>true</CsWinRTComponent>
    </PropertyGroup>
    

    有关 C#/WinRT project属性的完整列表,请参阅 C#/WinRT NuGet 文档.

  4. 可以使用库 .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";
            }
        }
    }
    
  5. 现在你可以构建(软件)项目以生成组件的 .winmd 文件。 右键单击 解决方案资源管理器 中的项目,然后单击 Build。 你将在生成输出文件夹中看到生成的 AuthoringDemo.winmd 文件。

为组件生成 NuGet 包

大多数开发人员希望将其Windows 运行时组件作为 NuGet 包进行分发和共享。 另一个选项是将组件作为项目引用进行使用。 以下步骤演示如何打包 AuthoringDemo 组件。 生成包时,C#/WinRT 会将组件和托管程序集配置好,以便原生应用程序能够使用。

可通过多种方式生成 NuGet 包:

  • 如果要每次生成project时生成 NuGet 包,请将以下属性添加到 AuthoringDemo project 文件中,然后重新生成project。

    <PropertyGroup>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    </PropertyGroup>
    
  • 或者,可以通过右键单击 解决方案资源管理器1 中的 AuthoringDemo 项目,然后选择 Pack 来生成 NuGet 包。

生成包时, “生成 ”窗口应指示已成功创建 NuGet 包 AuthoringDemo.1.0.0.nupkg 。 有关使用 dotnet 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 或更高版本。

  1. 向解决方案添加一个新的 C++/WinRT 控制台应用程序 项目。 请注意,如果您选择这样做,此项目也可以是其他解决方案的一部分。

    a。 在 解决方案资源管理器 中,右键单击解决方案节点,然后单击 Add ->New Project

    b. 在 Add New Project 对话框中搜索 C++/WinRT 控制台应用程序 project模板。 选择模板并单击 下一步

    选项c. 将新的 project CppConsoleApp 命名,然后单击 Create

  2. 将对 AuthoringDemo 组件的引用添加为 NuGet 包或项目引用。

    • 选项 1(软件包引用)

      a。 右键单击 CppConsoleApp project 并选择 Manage NuGet 包。 您可能需要配置您的包源,以便添加对 "AuthoringDemo" NuGet 包的引用。 为此,请单击 NuGet 程序包管理器 中的 Settings 图标,并将包源添加到相应的路径。

      NuGet 设置

      b. 配置包源后,搜索 AuthoringDemo 包,然后单击“ 安装”。

      安装 NuGet 包

    • Option 2 (Project reference)

      a。 右键单击 CppConsoleApp project 并选择 Add ->Reference。 在 Projects 节点下,添加对 AuthoringDemo project 的引用。

  3. 若要托管组件,需要添加清单文件以用于可激活的类注册。 有关管理组件托管的更多详细信息,请参阅 Managed 组件托管

    a。 若要添加清单文件,请再次右键单击project并选择Add ->新建项。 搜索 文本文件 模板并将其命名为 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包清单文件中注册可激活类,如 Walkthrough:使用 WinUI 控件创建 C# 组件并从 C++ Windows 应用 SDK 应用程序使用中所述。

    b. 修改项目,以在项目部署时在输出中包含清单文件。 在 解决方案资源管理器1 中单击 CppConsoleApp.exe.manifest 文件,并将 Content 属性设置为 True。 下面是如下所示的示例。

    部署内容

  4. 打开项目的头文件 pch.h,并添加以下代码行以包含你的组件。

    #include <winrt/AuthoringDemo.h>
    
  5. 在project的源文件下打开 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;
    }
    
  6. 生成并运行 CppConsoleApp project。 现在应会看到以下输出。

    C++/WinRT 控制台输出