我正在构建一个 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。
根据您的 Dockerfile,我相信您有两个问题:
第一个问题的快速修复是将 x86 运行时复制到现有映像中。这是更改 Dockerfile 来实现此目的的示例。
您可以通过使用
ContainerVsDbgPath
手动指定调试器以及使用 DockerDebuggeeProgram
启动的程序来修复第二个问题。以下是这些属性的 docs,以及设置它们以支持容器中 x86 调试的 example。在制作示例时,我需要使用 ServerCore 作为基础映像来运行 x86 运行时,因此我能够使用完整的远程调试器。