4

我们正在尝试在容器中构建一个 .NET core 3.1 应用程序,使用具有不同参数的dotnet publishdotnet build命令。dotnet msbuild成功了,但问题是 EXE 输出从不显示任何文件详细信息(版权、文件版本等为空),而 DLL 确实包含指定的信息。我们尝试了几种不同的容器,以及在线研究并尝试了不同的命令参数,用于版本控制(有一些)。此外,直接在我的 Windows 10 机器上运行相同的 dotnet publish 命令,按预期工作,没有问题。

我还尝试分离dotnet builddotnet publish( --no-build) 命令并在其间复制代码签名的 EXE,以防存在信任问题,但没有任何效果。

Dockerfile 内容(也用于dotnet publish代替msbuild):

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine3.11

ARG Version="5.6.7"

WORKDIR /build

COPY ./src $WORKDIR

RUN dotnet restore

RUN echo $Version

RUN dotnet msbuild abc.csproj /t:Build /p:PublishSingleFile=True /p:SelfContained=True /p:PublishProtocol=FileSystem /p:Configuration=Release /p:Platform=x64 /p:TargetFrameworks=netcoreapp3.1 /p:PublishDir=publish /p:RuntimeIdentifier=win-x64 /p:PublishReadyToRun=False /p:PublishTrimmed=False /p:VersionNumber=$Version /p:VersionPrefix=$Version /p:Version=$Version /p:AssemblyVersion=$Version /p:AssemblyVersionAttribute=$Version /p:FileVersion=$Version /p:AssemblyFileVersionAttribute=$Version

重现步骤:

  1. 创建 Dockerfile,类似上面
  2. 为 .NET Core 控制台应用程序运行 docker build 命令(替换 abc.csproj)
  3. 使用容器 ID 运行 docker run 命令
  4. 将发布内容复制到本地文件系统并查看 EXE 文件详细信息
4

3 回答 3

1

我认为有一个问题仍然存在,我认为你应该看看SDK你的容器和 Windows 之间的版本有什么不同,并尝试在你的容器中使用该工作版本

于 2020-08-28T10:43:33.580 回答
1

此处描述了此问题:https ://github.com/dotnet/sdk/issues/4127 。从那个链接:

仅当在 Windows 上构建时,PE 资源才会从 App.dll 传输到主机 App.exe——因为资源处理代码当前使用本机 Win32 API。因此,当应用程序从 Linux 或 nanoserver 发布时,不会传输资源。

该问题已关闭,指向计划的跨平台工作以重写这些资源的编写方式(https://github.com/dotnet/runtime/issues/3828)。这项工作已被推迟到 dotnet 6.0.0 里程碑,因此不幸的是,目前让 .exe 包含这些程序集信息资源的唯一方法是dotnet publish直接在 Windows 主机上运行该命令。

于 2020-08-31T14:31:53.537 回答
0

在这个线程中,我为自己找到了一个解决方案,它也解决了这里讨论的问题: https ://stackoverflow.com/a/67336316/8041403

TL;博士

  • 图像是nanoserver问题(这是标准 .NET 核心图像的基础)
  • 用作mcr.microsoft.com/dotnet/sdk:5.0-windowsservercore-ltsc2019图像,它使用servercore
于 2021-04-30T15:19:35.810 回答