如何使用 Visual Studio 2022 在 Docker 中调试 x86 .net7 服务

问题描述 投票:0回答:1

我正在构建一个 C# 中间件服务,该服务必须调用 32 位 COM DLL 并调用 SOAP Web 服务。该服务是针对 .NET7.0 编写的,我使用的是 Visual Studio 2022 Community Edition。

由于该 DLL,该项目必须针对 x86 Windows 平台。

我想将这项服务容器化。我安装了最新的 Docker 桌面,并向项目添加了 Docker 支持。

当我点击“调试”时,VS 正确创建容器并下载预期的图像,但是,一旦容器启动并运行,它只是默默地退出调试模式,并且调试窗口或容器工具日志中都没有输出.

Dockerfile 几乎是 VS 默认生成的:

FROM mcr.microsoft.com/dotnet/runtime:7.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["Trayport/Trayport.csproj", "Trayport/"]
RUN dotnet restore "Trayport/Trayport.csproj"
COPY . .
WORKDIR "/src/Trayport"
RUN dotnet build "Trayport.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Trayport.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Trayport.dll"]

这是 csproj:

<Project Sdk="Microsoft.NET.Sdk.Worker">
  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-Trayport-69c0cd6b-2a27-4fa8-ab42-df4d743d63e3</UserSecretsId>
    <DockerDefaultTargetOS>Windows</DockerDefaultTargetOS>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <Platforms>x86</Platforms>
  </PropertyGroup>

  <ItemGroup>
    <COMReference Include="GV8APILib">
      <VersionMinor>0</VersionMinor>
      <VersionMajor>1</VersionMajor>
      <Guid>0a67e301-3ecb-47be-bba9-dc67ff219358</Guid>
      <Lcid>0</Lcid>
      <WrapperTool>tlbimp</WrapperTool>
      <Isolated>false</Isolated>
      <EmbedInteropTypes>True</EmbedInteropTypes>
    </COMReference>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
    <PackageReference Include="System.ServiceModel.Duplex" Version="4.10.*" />
    <PackageReference Include="System.ServiceModel.Federation" Version="4.10.*" />
    <PackageReference Include="System.ServiceModel.Http" Version="4.10.*" />
    <PackageReference Include="System.ServiceModel.NetTcp" Version="4.10.*" />
    <PackageReference Include="System.ServiceModel.Security" Version="4.10.*" />
  </ItemGroup>

  <ItemGroup>
    <None Update="Gv8Api.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="trayport-api-schema.xsd">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

根据我在大量谷歌搜索后收集到的信息,这似乎与以下事实有关:VS docker 构建部署并运行 64 位远程调试器到容器,但随后尝试附加到 32 位位调试器。当它找不到时,它就会停止,没有输出。

话又说回来,问题可能完全出在其他地方......

如果相关的话,Docker Desktop 和 VS 运行在同一台主机上,即 64 位 Windows 11 PC。

docker visual-studio debugging 32bit-64bit
1个回答
0
投票

根据您的 Dockerfile,我相信您有两个问题:

  1. 官方 .NET 运行时映像仅具有 x64 运行时。
  2. VS 中的容器工具采用 x64,因此它们仅设置 x64 调试器,并尝试启动 x64 运行时。

第一个问题的快速修复是将 x86 运行时复制到现有映像中。这是更改 Dockerfile 来实现此目的的示例
您可以通过使用

ContainerVsDbgPath
手动指定调试器以及使用
DockerDebuggeeProgram
启动的程序来修复第二个问题。以下是这些属性的 docs,以及设置它们以支持容器中 x86 调试的 example。在制作示例时,我需要使用 ServerCore 作为基础映像来运行 x86 运行时,因此我能够使用完整的远程调试器。

© www.soinside.com 2019 - 2024. All rights reserved.