c# - 使用 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。
解决方案
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。
推荐阅读
- c - How to turn a horizontal matrix vertical?
- java - 使用新政策被 Play 管理中心拒绝的通话功能
- algorithm - 在 Laravel 中自定义验证函数
- ios - VTDecompressionSession - IOSurface分配逐渐增加
- jquery - 正则表达式检查图像上的链接是否有效
- sql-server - 遵循 Microsoft 教程的 SQLDisconnect 中的 ODBC 错误
- javascript - 删除数组中的重复项
- android - 无法从基础应用程序和应用程序崩溃启动动态模块启动活动
- c# - 在 Xamarin.Forms 页面中隐藏 iPhone X 的主页指示器
- .net - 构建一个 .net 和 sql server 数据 mngmt 应用程序,其中应用程序 sql 存储在表中是一种合理的方法吗?