如何在 Windows 上创建针对 WPF 的 .NET 核心库?

Posted

技术标签:

【中文标题】如何在 Windows 上创建针对 WPF 的 .NET 核心库?【英文标题】:How to create .NET core lib targeting WPF on Windows? 【发布时间】:2021-09-10 13:47:58 【问题描述】:

我的解决方案中有以下项目(简化):

Helpers,一个带有通用帮助方法的 .NET Core 5.0 库 ConsoleApp,一个 .NET Core 5.0 控制台应用程序,它使用 Helpers.lib。 ConsoleApp 必须在 Windows 和 Linux 上运行。 HelpersWpfCore,问题,这应该是一个 .NET Core 5.0 库,它使用 Helpers.lib 并包含一些 WPF 功能,如对打印、文档、用户控件等的支持。 WpfApp,一个 .NET Core 5.0 WPF 应用程序,它必须使用 Helpers.lib 和 HelpersWpfCore.lib。 WpfApp 只需在 Windows 上运行。

我的问题是我无法编译 HelpersWpf 库。我收到了类似的错误

  Error CS0246: Der Typ- oder Namespacename "IValueConverter" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (15, 31)

  Error CS0246: Der Typ- oder Namespacename "BindingMode" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (15, 13)

  Error CS0246: Der Typ- oder Namespacename "DependencyProperty" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (14, 95)

  Error CS0246: Der Typ- oder Namespacename "FrameworkElement" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (14, 38)

  Error CS0234: Der Typ- oder Namespacename "Shapes" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (7, 22)

  Error CS0234: Der Typ- oder Namespacename "Data" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (6, 22)

  Error CS0234: Der Typ- oder Namespacename "Controls" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (5, 22)

  Error CS0246: Der Typ- oder Namespacename "Adorner" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (8, 23)

  Error CS0246: Der Typ- oder Namespacename "UIElement" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (8, 54)

  Error CS0234: Der Typ- oder Namespacename "Documents" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (2, 22)

  Error CS0246: Der Typ- oder Namespacename "DrawingContext" wurde nicht gefunden (möglicherweise fehlt eine using-Direktive oder ein Assemblyverweis). (10, 42)

  Error CS0234: Der Typ- oder Namespacename "Media" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (3, 22)

  Error CS0234: Der Typ- oder Namespacename "Documents" ist im Namespace "System.Windows" nicht vorhanden. (Möglicherweise fehlt ein Assemblyverweis.) (2, 22)

("wurde nicht gefunden" => "未找到")

在 HelpersWpfCore -> Dependencies -> Frameworks 中仅列出“Microsoft.NETCore.App”。

我怎样才能实现缺失的类将包含在库中?

我知道这是 .NET Core 而不是 .NET Framework(这已经更早了,并且在 4.7.2 中运行良好)。但由于 WPF 核心应用程序只能在 Windows 上运行,我认为这应该是可能的,尤其是在 2021 年和 Core 5.0 中,不是吗?

由于某些情况,使用 Multitargeting 切换回 WpfApp 的 .NET Framework 对我来说不是一个解决方案。

【问题讨论】:

哦,我忘记了:我使用的是 VisualStudio 2019 【参考方案1】:

您似乎使用错误的模板创建了项目。

在解决方案资源管理器中双击项目。这将打开项目文件。或者直接打开 .csproj 文件。

通过检查<TargetFramework> 标记,确保您使用的是正确的目标框架名字对象。

.NET 5 是跨平台的。它只支持跨平台库。 AdornerUIElement 等是针对包含在 Windows 特定库中的专用类的 Windows(或 WPF)。 (与 UI 相关的库或 WPF 等框架从不跨平台兼容)。

由于您使用的是 Windows 特定资源,因此您必须在配置项目的目标框架时明确指定操作系统。 这当然会删除库的跨平台兼容性。 您可以在Microsoft Docs: .NET 5+ OS-specific TFMs中找到目标框架名字对象列表

因此,正确的目标框架名字对象应该是 net5.0-windows(这会将缺少的对 Microsoft.WindowsDesktop.App 的引用添加到项目的依赖项中):

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

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

  ...

</Project>

请注意,要最终启用正确的 SDK(在您的情况下为 WPF),您必须添加相应的 MSBuild 属性(参见上面的示例):

&lt;UseWPF&gt;true&lt;/UseWPF&gt;

见Microsoft Docs: MSBuild reference for .NET Desktop SDK projects

【讨论】:

我之前尝试将 TargetFramework 从“net5.0”更改为“net5.0-windows”,但这样做并添加“true”终于成功了。这减少了我的大部分错误。非常感谢! > 看起来您从错误的模板创建了项目。我之前也怀疑过这个,但我没有找到合适的。也许之前必须安装一个额外的模板?哪一个? 无论如何,现在还有一些命名空间尚未解析:a) System.Drawing(用于使用例如位图类)和 b) System.Windows.Forms(用于使用标准对话框来自 WinForms,多年后 WPF 仍然缺少它)。我可以没有 a),因为我不需要我的 Image 类来解决这个问题并将它们注释掉,但是你有 b) 的解决方法吗? @HansHeinz 你不应该使用 System.Drawing。它仅包含 WinForms 类。它们依赖于旧的 GDI+ 渲染引擎,而 WPF 使用现代的 DirectX 引擎。查看System.Windows.Media namespace,其中包含针对DirectX 的等效类。否则,您必须使用 NuGet 包管理器安装 System.Drawing,因为命名空间不是 WPF。同样适用于 System.Windows.Forms。 要使用常用对话框,请查看Microsoft.Win32 namespace。它包含一个 OpenFileDialog 和 SaveFileDialog,它们是最好的对话框。

以上是关于如何在 Windows 上创建针对 WPF 的 .NET 核心库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows Forms/WPF 中为数据库视图(带连接)创建编辑器?

WPF开始教程[译]

带有WPF的Aero玻璃框架上类似Windows资源管理器的搜索框

如何从 IntPtr 句柄创建 WPF 光标 [重复]

Wpf-Application 在 Windows 10 上看起来不同

如何设置 WPF ListView 选定项颜色?