Docker发布时Release构建失败:MSB4803错误
解决.NET Core 6 Blazor Server发布到Portainer的Release构建失败问题
问题现象
Debug模式下项目可正常构建运行,但切换至Release模式或执行发布操作时构建失败,核心报错:
error MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild. Please use the .NET Framework version of MSBuild.
完整构建输出:
------ > [build 7/7] RUN dotnet build "Necon.csproj" -c Release -o /app/build: #15 2.489 All projects are up-to-date for restore. #15 3.000 /usr/share/dotnet/sdk/6.0.408/Microsoft.Common.CurrentVersion.targets(2927,5): error MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild. Please use the .NET Framework version of MSBuild. See https://aka.ms/msbuild/MSB4803 for further details. [/src/Necon/Necon.csproj] #15 3.007 #15 3.007 Build FAILED. #15 3.007 #15 3.007 /usr/share/dotnet/sdk/6.0.408/Microsoft.Common.CurrentVersion.targets(2927,5): error MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild. Please use the .NET Framework version of MSBuild. See https://aka.ms/msbuild/MSB4803 for further details. [/src/Necon/Necon.csproj] #15 3.007 0 Warning(s) #15 3.007 1 Error(s) #15 3.007 #15 3.007 Time Elapsed 00:00:01.90 ------ WARNING: buildx: git was not found in the system. Current commit information was not captured by the build Dockerfile:14
相关配置文件
Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["Necon/Necon.csproj", "Necon/"] RUN dotnet restore "Necon/Necon.csproj" COPY . . WORKDIR "/src/Necon" RUN dotnet build "Necon.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Necon.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Necon.dll"]
Necon.csproj
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <UserSecretsId>8ac9eb75-ec3e-42b0-b702-405a8e375b34</UserSecretsId> <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS> <EnableSdkContainerSupport>true</EnableSdkContainerSupport> </PropertyGroup> <ItemGroup> <COMReference Include="DecklinkPublicLib"> <WrapperTool>tlbimp</WrapperTool> <VersionMinor>0</VersionMinor> <VersionMajor>1</VersionMajor> <Guid>1469d378-8829-4ff0-9b3b-07dd5b16f3cb</Guid> <Lcid>0</Lcid> <Isolated>false</Isolated> <EmbedInteropTypes>true</EmbedInteropTypes> </COMReference> <COMReference Include="BMDSwitcherAPI"> <WrapperTool>tlbimp</WrapperTool> <VersionMinor>0</VersionMinor> <VersionMajor>1</VersionMajor> <Guid>8a92b919-156c-4d61-94ef-03f9be4004b0</Guid> <Lcid>0</Lcid> <Isolated>false</Isolated> <EmbedInteropTypes>true</EmbedInteropTypes> </COMReference> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.13" /> <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="6.0.13" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.13" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.13" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.13"> <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.0" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.11" /> <PackageReference Include="MudBlazor" Version="6.1.8" /> </ItemGroup> </Project>
.dockerignore
**/.classpath **/.dockerignore **/.env **/.git **/.gitignore **/.project **/.settings **/.toolstarget **/.vs **/.vscode **/*.*proj.user **/*.dbmdl **/*.jfm **/azds.yaml **/bin **/charts **/docker-compose* **/Dockerfile* **/node_modules **/npm-debug.log **/obj **/secrets.dev.yaml **/values.dev.yaml LICENSE README.md
发布设置截图

解决方案
方案1:预生成COM互操作程序集(推荐)
Linux容器的.NET Core MSBuild不支持动态解析COM引用,需提前在Windows环境生成互操作程序集:
- 打开Visual Studio开发者命令提示符,执行以下命令生成互操作DLL:
tlbimp DecklinkPublicLib.tlb /out:DecklinkPublicLib.dll tlbimp BMDSwitcherAPI.tlb /out:BMDSwitcherAPI.dll - 将生成的两个DLL文件添加到项目中,设置复制到输出目录为「如果较新则复制」
- 修改
Necon.csproj,移除原有的<COMReference>节点,替换为:<ItemGroup> <Reference Include="DecklinkPublicLib"> <HintPath>./你的文件路径/DecklinkPublicLib.dll</HintPath> <EmbedInteropTypes>true</EmbedInteropTypes> </Reference> <Reference Include="BMDSwitcherAPI"> <HintPath>./你的文件路径/BMDSwitcherAPI.dll</HintPath> <EmbedInteropTypes>true</EmbedInteropTypes> </Reference> </ItemGroup>
方案2:改用Windows容器构建
如果宿主机是Windows系统,可切换到Windows容器环境构建,Dockerfile修改如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0-nanoserver-ltsc2022 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/sdk:6.0-nanoserver-ltsc2022 AS build WORKDIR /src COPY ["Necon/Necon.csproj", "Necon/"] RUN dotnet restore "Necon/Necon.csproj" COPY . . WORKDIR "/src/Necon" RUN dotnet build "Necon.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Necon.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Necon.dll"]
方案3:条件性排除Release模式的COM引用(仅适用于Debug专属场景)
若COM组件仅用于本地Debug调试,发布后无需使用,可修改Necon.csproj:
<ItemGroup Condition="'$(Configuration)' == 'Debug'"> <COMReference Include="DecklinkPublicLib"> <WrapperTool>tlbimp</WrapperTool> <VersionMinor>0</VersionMinor> <VersionMajor>1</VersionMajor> <Guid>1469d378-8829-4ff0-9b3b-07dd5b16f3cb</Guid> <Lcid>0</Lcid> <Isolated>false</Isolated> <EmbedInteropTypes>true</EmbedInteropTypes> </COMReference> <COMReference Include="BMDSwitcherAPI"> <WrapperTool>tlbimp</WrapperTool> <VersionMinor>0</VersionMinor> <VersionMajor>1</VersionMajor> <Guid>8a92b919-156c-4d61-94ef-03f9be4004b0</Guid> <Lcid>0</Lcid> <Isolated>false</Isolated> <EmbedInteropTypes>true</EmbedInteropTypes> </COMReference> </ItemGroup>
同时代码中使用COM组件的部分需用#if DEBUG包裹,避免Release编译错误。
内容的提问来源于stack exchange,提问作者Ryland
相关产品推荐
相关产品推荐

