1

如何复制(我们将以 Windows 终端为例):

  1. 克隆 Windows 终端存储库并获取子模块

  2. UserControl使用一些随机控件在解决方案中创建 C# Windows 运行时组件

  3. 从要托管的项目中引用 C# WinRTUserControl组件

  4. 在 Windows 终端项目之一中打开 Xaml 页面(我们将使用TerminalPage.xamlfrom TerminalAppLibproject 作为示例)

  5. 添加UserControl到该页面

  6. 编译并运行(您可能需要包含UserControltopch.h文件的生成的 Xaml 编译文件,以便在没有 Xaml 编译器错误的情况下进行编译)

  7. 你会发现应用会崩溃class not registered异常

我试过的:

  1. 使用Class Library代替WinRT Component

  2. https://a.rcad.io/csharp-in-cppwinrt

  3. https://github.com/asklar/WinRTComponent/blob/master/README.md

  4. 在文件中注册类WindowsTerminal.manifest,如下所示(我使用.dll而不是.winmd尝试使用Class Library):

<file name="myWinRTComponent.winmd" hashalg="SHA1" xmlns:winrt="urn:schemas-microsoft-com:winrt.v1">
    <winrt:activatableClass name="Namespace.UserControlClass" threadingModel="both" />
</file>
  1. AppxManifest.xml在文件中手动注册类
4

1 回答 1

0

所以我终于找到了我们必须注册的解决方案,CLRHost.dll而不是运行时组件 Winmd 文件

因此,如果应用程序被打包,我们必须将其添加到Extensions标签内(这是标签内而Package不是标签内的那个ApplicationPackage.appxmanifest(请记住,这Namespace是控件的命名空间运行时组件名称/程序集名称 &UserControlClass是班级名称UserControl

<Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>CLRHost.dll</Path>
        <ActivatableClass ActivatableClassId="Namespace.Namespace_XamlTypeInfo.XamlMetaDataProvider" ThreadingModel="both" />
        <ActivatableClass ActivatableClassId="Namespace.UserControlClass" ThreadingModel="both" />
      </InProcessServer>
</Extension>

如果应用程序未打包,我们必须将其添加到标记内Application.manifest(请记住,这是应用程序的名称 &是控件的命名空间,运行时组件名称/程序集名称 &是类的名称)assemblyApplicationNamespaceUserControlClassUserControl

<file name="CLRHost.dll" xmlns:winrt="urn:schemas-microsoft-com:winrt.v1">
    <winrt:activatableClass name="Namespace.Namespace_XamlTypeInfo.XamlMetaDataProvider" threadingModel="both"/>
    <winrt:activatableClass name="Namespace.UserControlClass" threadingModel="both"/>
</file>
于 2021-06-17T14:56:17.433 回答