.NET Core风格csproj(目标net461)集成ILRepack.MSBuild.Task的问题
解决.NET Core风格.csproj(目标net461)的ILRepack集成问题
没问题,这就帮你搞定这个ILRepack集成的问题。原GitHub示例之所以对这类项目无效,核心是它采用手动指定DLL的死板方式,没有适配.NET Core风格.csproj的依赖管理逻辑,同时也没考虑net461平台的兼容性细节。下面是调整后的完整配置,我会逐段拆解关键改动:
<!-- ILRepack 合并配置:仅在Release构建时执行 --> <Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'"> <!-- 1. 自动收集需合并的程序集:主程序集 + 所有非系统依赖DLL --> <ItemGroup> <!-- 先指定你的项目输出的主程序集(自动适配Exe/Dll类型) --> <InputAssemblies Include="$(OutputPath)\$(AssemblyName).$(OutputType)" /> <!-- 自动收集输出目录下的所有依赖DLL,排除主程序集和系统类库 --> <InputAssemblies Include="$(OutputPath)\*.dll" Exclude="$(OutputPath)\$(AssemblyName).dll;$(OutputPath)\System.*.dll;$(OutputPath)\Microsoft.*.dll" /> </ItemGroup> <!-- 2. 配置不需要Internalize的程序集(无特殊需求可留空) --> <ItemGroup> <!-- 填写程序集的完整名称(不带.dll后缀),比如你不想重命名内部类型的第三方库 --> <DoNotInternalizeAssemblies Include="Newtonsoft.Json" /> </ItemGroup> <!-- 3. 执行ILRepack合并:适配net461平台的参数配置 --> <ILRepack Parallel="true" Internalize="true" InternalizeExclude="@(DoNotInternalizeAssemblies)" InputAssemblies="@(InputAssemblies)" <!-- 自动适配项目输出类型(Exe/Dll) --> TargetKind="$(OutputType)" <!-- 合并后的文件命名,避免覆盖原输出 --> OutputFile="$(OutputPath)\$(AssemblyName).merged.$(OutputType)" <!-- net461专属配置:保障.NET Framework兼容性 --> XmlDocumentation="true" CopyAttributes="true" AllowDuplicateResources="true" /> </Target> <!-- /ILRepack -->
关键改动说明:
- 自动收集依赖:不再手动罗列每个DLL,通过通配符批量收集输出目录的非系统依赖,同时排除主程序集和微软官方类库(这些不需要合并),适配.NET Core风格项目的依赖输出逻辑。
- net461兼容性适配:新增
XmlDocumentation(保留文档注释)、CopyAttributes(复制程序集属性)、AllowDuplicateResources(避免资源冲突)三个参数,确保合并后的程序集能在.NET Framework 4.6.1环境正常运行。 - 动态适配项目类型:用
$(OutputType)自动指定TargetKind,不管你的项目是控制台应用(Exe)还是类库(Dll)都能无缝适配。 - 安全输出命名:将合并后的文件命名为
$(AssemblyName).merged.exe/dll,不会覆盖原输出文件,方便对比测试。
额外注意事项:
- ILRepack仅能合并托管DLL,如果项目包含原生DLL,需要手动将这些文件拷贝到输出目录。
- 如果合并后出现类型冲突,可添加
AllowDuplicateTypes="true"参数,或者在DoNotInternalizeAssemblies中加入冲突的程序集名称。 - 记得切换到Release模式构建,因为配置中添加了
Condition="'$(Configuration)' == 'Release'",Debug模式不会触发合并逻辑。
内容的提问来源于stack exchange,提问作者Bruno Zell




