如何从单个csproj生成多个.NET 6控制台可执行文件?
单个.NET 6 CSPROJ生成多个可执行文件的解决方案
方案1:MSBuild多目标批量构建(最省心)
直接修改单个主csproj,让它为每个入口文件触发独立构建,自动继承所有公共配置:
- 先移除csproj里默认的单个入口编译配置(比如
<Compile Include="Program.cs" />) - 定义所有入口文件的集合,用通配符或逐个指定都可以:
<ItemGroup> <!-- 匹配所有以.exe.cs结尾的文件,或者直接列出来:Entry1.cs;Entry2.cs --> <EntryPoint Include="**/*.exe.cs" /> </ItemGroup>
- 添加自定义Target,为每个入口文件单独构建:
<Target Name="BuildAllExecutables" BeforeTargets="Build"> <MSBuild Projects="$(MSBuildProjectFile)" Targets="Build" Properties=" TargetFileName=%(EntryPoint.Filename); CompileInclude=$(MSBuildProjectDirectory)\%(EntryPoint.Identity); DefaultItemExcludes=**/*; OutputPath=$(OutputPath)\%(EntryPoint.Filename) " /> </Target>
- 每个入口文件会生成独立的exe,输出到
bin/[配置]/net6.0/[入口文件名]目录下,避免覆盖 - 所有NuGet引用、编译参数、框架版本都只需要在主csproj里改一次,全部构建自动继承
方案2:共享项目模式(低维护成本)
如果不想折腾复杂Target,用共享项目统一管理公共配置:
- 创建一个共享项目(.shproj),把所有公共依赖、通用代码、编译配置都放到这里
- 为每个入口文件创建极简csproj,只做两件事:引用共享项目、指定当前入口文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> </PropertyGroup> <ItemGroup> <ProjectReference Include="..\SharedCode\SharedCode.shproj" /> <Compile Include="MyAppEntry.cs" /> </ItemGroup> </Project>
- 公共配置只需要在共享项目里修改,所有子csproj自动同步,每个子项目只需要几行代码,几乎不需要维护
方案3:直接调用Csc任务编译
如果想更底层控制编译过程,直接在主csproj里用Csc任务批量编译:
<!-- 列出所有入口文件 --> <ItemGroup> <EntryFiles Include="Entry1.cs;Entry2.cs;Entry3.cs" /> </ItemGroup> <Target Name="BuildMultipleExes" AfterTargets="CoreCompile"> <Csc Sources="%(EntryFiles.Identity)" References="@(ReferencePath)" <!-- 自动复用SDK和NuGet的所有引用 --> OutputAssembly="$(OutputPath)\%(EntryFiles.Filename).exe" TargetType="Exe" PlatformTarget="$(PlatformTarget)" LangVersion="$(LangVersion)" /> </Target>
- 这个方案直接复用.NET SDK自动生成的引用集合,不用手动添加CLR或NuGet引用,开箱即用
内容的提问来源于stack exchange,提问作者MarkovskI
相关产品推荐
相关产品推荐

