【发布时间】: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或dotnetCLI)。 -
@mason 谢谢你的回答。抱歉,我不是 .NET 环境方面的专家。您能否告诉我更多关于“将您的应用程序切换到目标 .NET Core”的信息?我不能使用 .NET Framework,因为 Docker 基础映像在 GNU/Linux 主机上不可用。
-
@LexLi 谢谢你的回答。我添加了一个基于单声道图像的 Dockerfile,并进行了一些重构以使构建通过。 AFAIK,.NET Core 不仅仅是 Windows,例如检查 docs.microsoft.com/en-us/dotnet/core/install/…。