【问题标题】:Building a WinForms C# application with Docker .NET Core image results to an error : .NETFramework,Version=v4.6.1 were not found使用 Docker .NET Core 映像构建 WinForms C# 应用程序会导致错误:.NETFramework,Version=v4.6.1 were not found
【发布时间】:2020-04-18 21:39:18
【问题描述】:

我正在尝试构建一个 C# 项目,使用 WinForms(如果有帮助的话),在 GNU/Linux 下使用 Docker 和 .NET Core Docker 映像,如 the documentation 中所述。免责声明:我不是 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,例如in this official example:

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。

【问题讨论】:

  • 您有一个 .NET Framework 应用程序,但您尝试在 .NET Core 容器中构建它?那是行不通的。您需要使用包含适当工具的容器来构建 .NET Framework 应用程序,或者将您的应用程序切换到以 .NET Core 为目标。
  • 1) 安装了 Mono 后,您应该调用 msbuild 来编译项目。但是,Mono 上的 WinForms 从来都不是一个完整的尝试,所以你不应该期望它一直有效。 2) .NET Framework 或 .NET Core 上的 WinForms 仅适用于 Windows,因此就像其他人评论的那样,您只能使用 Windows 机器(或 Windows Docker 映像)通过正确的工具(msbuild 或 dotnet CLI)。
  • @mason 谢谢你的回答。抱歉,我不是 .NET 环境方面的专家。您能否告诉我更多关于“将您的应用程序切换到目标 .NET Core”的信息?我不能使用 .NET Framework,因为 Docker 基础映像在 GNU/Linux 主机上不可用。
  • @LexLi 谢谢你的回答。我添加了一个基于单声道图像的 Dockerfile,并进行了一些重构以使构建通过。 AFAIK,.NET Core 不仅仅是 Windows,例如检查 docs.microsoft.com/en-us/dotnet/core/install/…。

标签: c# .net docker .net-core


【解决方案1】:

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。

UI 框架

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

.NET Core 有一些第三方替代方案,例如:Avalonia 或 GtkSharp。

【讨论】:

  • 感谢您的回答和澄清。我现在明白了。要恢复(如果我真的理解你的答案),我必须在这里使用 Mono 在 Docker 容器中的 GNU/LInux 上构建我的应用程序。 .NET Core 映像在这里不适合,因为 WinForms 仍然只是 Windows。我说的对吗?
  • 是的,你是对的。因为我只是尝试在 Linux 容器中构建一个 .net 核心 winforms 应用程序,结果是:NETSDK1100: Windows is required to build Windows desktop applications. 所以你甚至不能在 docker 中构建 windows :(
  • 谢谢,那么让我们使用 Mono。这很奇怪,因为在另一个问题上,有人告诉我 (stackoverflow.com/questions/61278260/…) 将 C# 应用程序移植到 Mono 而不是 .NET Core 是一种“异端邪说”。你怎么看?
  • 我不认为单声道是 异端,xamarin 的东西也依赖于单声道。如果没有 UI,我会倾向于 .net 核心。一般来说,我建议将所有非 UI 代码移植到 .NET Standard 类库。这样您就可以在任何地方使用这些库,并将框架决策推迟到应用程序并保留所有选项。
【解决方案2】:

正如@mason 所指出的,您需要提取一个可以使用 .NET Framework SDK 的图像。抓住official image for the .NET Framework SDK,这样你就可以dotnet restore/build...

FROM mcr.microsoft.com/dotnet/framework/sdk:4.8

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

# Build the app
WORKDIR /app/MyProject
RUN     dotnet build

# Uncomment to run the tests (assuming MyProjectUnitTests is a test project :-)
#WORKDIR /app/MyProjectUnitTests
#dotnet test

有一个很好的 .NET Framework Dockerfile here 示例。 YMMV 在 Mono 上使用这个

【讨论】:

  • 感谢您的回答。不幸的是,mcr.microsoft.com/dotnet/framework/sdk:4.8 图像在 Linux 机器上不可用(docker pull 返回错误:no matching manifest for linux/amd64 in the manifest list entries),因此需要 Windows 主机(我没有)。事实上,我正在尝试在 GNU/LInux 主机下构建项目,就像我在问题开始时所说的那样。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 2018-05-28
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多