簡體   English   中英

無法在 C++/WinRT Xaml Islands 項目中使用來自 C# WinRT 組件的 Xaml 組件

[英]Cannot use an Xaml component from a C# WinRT Component in C++/WinRT Xaml Islands project

如何復制(我們將以 Windows 終端為例):

  1. 克隆 Windows 終端存儲庫並獲取子模塊

  2. 使用帶有一些隨機控件的UserControl在解決方案中創建 C# Windows 運行時組件

  3. 從要在其中托管UserControl的項目中引用 C# WinRT 組件

  4. 在 Windows 終端項目之一中打開 Xaml 頁面(我們將使用來自TerminalPage.xaml項目的TerminalAppLib作為示例)

  5. UserControl添加到該頁面

  6. 編譯並運行(您可能需要將UserControl生成的 Xaml 編譯文件包含到pch.h文件中,以便在沒有 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文件中注冊 class,如下所示(當我嘗試使用Class Library時,我使用.dll而不是.winmd ):

<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文件中手動注冊 class

所以我終於找到了我們必須注冊CLRHost.dll而不是運行時組件 Winmd 文件的解決方案

因此,如果應用程序被打包,我們必須將其添加到 Package.appxmanifest 的Extensions標記內(它位於Package標記內,而不是Application標記內)( Package.appxmanifest記住, Namespace是控件運行時的命名空間組件名稱/組件名稱 & UserControlClassUserControl類的名稱)

<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>

如果應用程序未打包,我們必須將其添加到程序assembly標記內的Application.manifest (請記住, Application是應用程序的名稱, Namespace是控件的命名空間運行時組件名稱/程序集名稱和UserControlClassUserControl類的名稱)

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM