首页 > 解决方案 > 使用 Docker .NET Core 映像构建 WinForms C# 应用程序会导致错误:.NETFramework,Version=v4.6.1 were not found

问题描述

我正在尝试使用 WinForms(如果有帮助)在 GNU/Linux 下使用 Docker 和 .NET Core Docker 映像构建一个 C# 项目,如文档中所述。免责声明:我不是 C# 或 .NET 方面的专家。

我的项目结构如下:

.
├── MyProject.sln
└── MyProject
│   ├── Package1
│   |   └── ...
│   ├── Package2
│   |   └── ...
│   └── MyProject.csproj
└── MyProjectUnitTests
    ├── ...
    └── MyProjectUnitTests.csproj

在这两个.csproj文件中,目标框架版本是v4.6.1

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-->...<-->
  <PropertyGroup>
    <!-->...<-->
    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
  </PropertyGroup>
</Project>

我正在使用以下内容Dockerfile,就像在这个官方示例中一样:

FROM    mcr.microsoft.com/dotnet/core/sdk:3.1.201-buster

WORKDIR /app

# copy all files necessary to resolve dependencies
COPY    MyProject.sln .
COPY    MyProject/MyProject.csproj MyProject/
COPY    MyProjectUnitTests/MyProjectUnitTests.csproj MyProjectUnitTests/

# resolve dependencies
RUN     dotnet restore --verbosity normal

# copy all files
COPY    . .

RUN     dotnet build

依赖项的下载工作正常(dotnet restore),但最后一个命令(dotnet build)失败并出现以下错误:

Build FAILED.

/usr/share/dotnet/sdk/3.1.201/Microsoft.Common.CurrentVersion.targets(1177,5): error MSB3644: The reference assemblies for .NETFramework,Version=v4.6.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/MyProjectUnitTests/MyProjectUnitTests.csproj]
/usr/share/dotnet/sdk/3.1.201/Microsoft.Common.CurrentVersion.targets(1177,5): error MSB3644: The reference assemblies for .NETFramework,Version=v4.6.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks [/MyProject/MyProject.csproj]
    0 Warning(s)
    2 Error(s)

我不明白错误。这些错误将我重定向到 Microsoft 网站,在那里我可以找到下载和安装 .NET Core 3.1.201 的说明,但这正是我使用该mcr.microsoft.com/dotnet/core/sdk:3.1.201-buster图像的原因,以避免自己安装它。

该项目似乎在 Windows 上构建良好(没有 Docker),但我没有任何可用的 Windows 机器。我是否遗漏了.csproj文件中的某些内容?有人说我应该安装Mono,但我尝试安装mono-complete包,但仍然遇到同样的错误。

有人知道吗(这可能只是一个小错误,因为我不太了解 .NET 环境)?

编辑:使用 .NET Core 映像构建失败,但使用单声道成功

我忘了提及它,但 Docker 容器内的构建适用于基本映像mono:6.8.0.96和以下 Dockerfile :

FROM    mono:6.8.0.96

WORKDIR /app

# copy all files necessary to resolve dependencies
COPY    MyProject.sln .
COPY    MyProject/MyProject.csproj MyProject/
COPY    MyProjectUnitTests/MyProjectUnitTests.csproj MyProjectUnitTests/

# resolve dependencies
RUN     nuget restore

# copy all files
COPY    . .

RUN     msbuild

正如@LexLi 在评论中指出的那样,需要重构一些代码(尤其是 WPF API 调用,因为 Mono 不支持它),但使用 Mono 构建成功。

为了避免这种重构,如果可能的话,我想使用 Microsoft 基础映像而不是 Mono。

标签: c#.netdocker.net-core

解决方案


TLDR:您不能仅使用 Microsoft 的 .NET 东西为 Linux 构建桌面应用程序。您的替代方案是 Mono 或第三方 UI 堆栈。

您无法使用 .NET Framework 或 .NET Core 在 Linux 上构建 WinForms 应用程序。要理解这一点,您必须了解 .NET 生态系统:

运行时

  • .NET Framework仅适用于 Windows,并且已完成. 不要期望 .NET Framework 有太大变化。要在 .NET Framework 上构建应用程序,您必须使用 Windows

  • .NET Core是相当新的跨平台 .NET,几乎可以在任何地方运行。虽然 .NET Core 是跨平台的,但 WPF 和 WinForms 仍然仅适用于 Windows。

  • Mono是 .NET Framework 的另一种开源实现,Mono 包含一个 WinForms 实现,但正如@Frank Alvaro 所说的那样,YMMV。

用户界面框架

.NET Core 从 3.0 版开始支持构建桌面应用程序,但仅在 Windows 上。UI 框架、WinForms ( Windows Forms) 和 WPF ( Windows Presentaion Foundation) 或多或少都是围绕 Windows API 的包装器,目前微软似乎对让它们跨平台不感兴趣。所以遗憾的是没有官方的 WinForms 或 Linux 的 WPF。

.NET Core 有一些第三方替代品,例如:AvaloniaGtkSharp


推荐阅读