[英]Cannot use an Xaml component from a C# WinRT Component in C++/WinRT Xaml Islands project
如何復制(我們將以 Windows 終端為例):
克隆 Windows 終端存儲庫並獲取子模塊
使用帶有一些隨機控件的UserControl
在解決方案中創建 C# Windows 運行時組件
從要在其中托管UserControl
的項目中引用 C# WinRT 組件
在 Windows 終端項目之一中打開 Xaml 頁面(我們將使用來自TerminalPage.xaml
項目的TerminalAppLib
作為示例)
將UserControl
添加到該頁面
編譯並運行(您可能需要將UserControl
生成的 Xaml 編譯文件包含到pch.h
文件中,以便在沒有 Xaml 編譯器錯誤的情況下進行編譯)
你會發現應用程序會因為class not registered
異常而崩潰
我試過的:
使用Class Library
代替WinRT Component
https://github.com/asklar/WinRTComponent/blob/master/README.md
在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>
AppxManifest.xml
文件中手動注冊 class所以我終於找到了我們必須注冊CLRHost.dll
而不是運行時組件 Winmd 文件的解決方案
因此,如果應用程序被打包,我們必須將其添加到 Package.appxmanifest 的Extensions
標記內(它位於Package
標記內,而不是Application
標記內)( Package.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>
如果應用程序未打包,我們必須將其添加到程序assembly
標記內的Application.manifest
(請記住, Application
是應用程序的名稱, Namespace
是控件的命名空間,運行時組件名稱/程序集名稱和UserControlClass
是UserControl
類的名稱)
<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.