如何将 UWP 类库链接到 WPF 应用程序?

Posted

技术标签:

【中文标题】如何将 UWP 类库链接到 WPF 应用程序?【英文标题】:How to link UWP Class Library into an WPF Application? 【发布时间】:2021-10-19 18:07:18 【问题描述】:

我创建了一个带有单个测试类的 UWP 类库。我有一个想要使用该类库的 WPF .NET 应用程序。我需要遵循哪些步骤?

在this tutorial 之后,我想在我的应用程序MyApp 中添加库MyLib。但我发现以下编译器错误,

严重性代码描述项目文件行抑制状态 错误 NU1201 项目 MyLib 与 netcoreapp3.1 不兼容 (.NETCoreApp,版本=v3.1)。 MyLib 项目支持: uap10.0.19041 (UAP,Version=v10.0.19041) MyApp C:\Users....\MyApp.csproj

##更新

添加以下代码后,

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0-windows</TargetFramework>
    <AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\MyLib\MyLib.csproj" />
  </ItemGroup>

</Project>

正如 TamBui 在答案中所建议的,我遇到了构建错误。但是,从一开始就有两个编译器警告。有什么线索就分享一下,

    警告 NETSDK1137 不再需要使用 Microsoft.NET.Sdk.WindowsDesktop SDK。考虑更改 SDK 根 Project 元素的属性 'Microsoft.NET.Sdk'。 MyApp C:\Program Files\dotnet\sdk\5.0.103\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets 376

    警告 MSB3270 处理器之间不匹配 正在构建的项目架构“MSIL”和处理器 参考架构 "C:\Users...\MyLib\bin\x64\Debug\MyLib.dll", “AMD64”。这种不匹配可能会导致运行时失败。请考虑 通过更改项目的目标处理器架构 配置管理器以调整处理器架构 在您的项目和参考之间,或依赖于 具有与目标相匹配的处理器架构的参考 项目的处理器架构。 MyApp C:\程序文件 (x86)\微软视觉 Studio\2019\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets 2123

【问题讨论】:

您的 UWP 类库是 .NET 5 库吗? .NET 标准?因为它应该与 .NET Standard 兼容,但可能与 .NET 5 不兼容。 @TamBui 如何查看? 我的错,我走错了方向。请阅读我的答案。 【参考方案1】:

WPF 应用程序无法引用 UWP 类库。总之,两个不同的平台或框架是不兼容的。

您应该将类​​库的目标框架 (MyLib.csproj) 更改为 .NET Standard 或 WPF 应用所针对的相同框架:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

</Project>

【讨论】:

WPF 应用程序可以引用 UWP 类库,甚至可以在 WPF 应用程序中托管 UWP 控件。看看“XAML Islands”,你会发现它是可能的。当然,一旦 WinUI 3 出现,所有这些都应该越来越没有实际意义。 我知道可以在 WPF 应用中托管 UWP 控件,但您仍然不应该从桌面应用中引用 UWP 类库。【参考方案2】:

您需要将与您的 UWP 项目的目标版本匹配的 AssetTargetFallback 添加到您的 WPF 项目的 PropertyGroup。在解决方案资源管理器中选择您的 WPF 项目,您将能够编辑该项目的属性。

<PropertyGroup>
  <OutputType>WinExe</OutputType>
  <TargetFramework>netcoreapp3.1</TargetFramework>
  <RootNamespace>_68824006</RootNamespace>
  <AssetTargetFallback>uap10.0.19041</AssetTargetFallback>
  <UseWPF>true</UseWPF>
</PropertyGroup>

【讨论】:

请看我更新的帖子。遵循您的建议后不再出现编译器错误,但现在出现构建错误。 这些是警告,而不是错误。要摆脱第一个警告,请将项目中的第一行编辑为 &lt;Project Sdk="Microsoft.NET.Sdk"。要消除第二个警告,您需要将 WPF 项目的平台体系结构与 UWP 项目的体系结构相匹配。为此,请在解决方案资源管理器中右键单击您的解决方案并选择“配置管理器...” 无论如何构建错误让我感到沮丧。无论如何要知道问题出在哪里? 您遇到的构建错误是什么?在您之前的评论中,您说“在遵循您的建议后不再存在编译器错误”。然后,您发布了两个警告。我没有看到您发布任何构建错误,除非我错过了它?

以上是关于如何将 UWP 类库链接到 WPF 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在win32 C++控制台应用程序中调用uwp类库

在WPF应用程序中使用UWP UI

如何将项目添加到 UWP 应用程序的资源管理器上下文菜单

是否可以在 WPF 应用程序中使用 UWP API?

WPF 将窗口控件封装到类库中使用

在UWP最终包中包含可执行文件