TeamCity2020.2.2中MSBuild编译VS2019 dll项目Eazfuscator.NET混淆报错
TeamCity 2020.2.2 编译VS2019类库集成Eazfuscator.NET 2018.2混淆报错
问题场景
在TeamCity 2020.2.2构建流水线中,配置MSBuild 2019步骤编译Visual Studio 2019环境下的DLL类库项目,编译完成后通过MSBuild自动钩子调用Eazfuscator.NET 2018.2执行代码混淆,流程执行到混淆阶段直接触发编译失败。
原始报错信息
EXEC: error: Error occurred during processing of input file '.dll' -> Cannot load file or assembly 'zx_2cba06c4237a413ea1e8116e71ad61dc, PublicKeyToken = 6205972ab2f0fc68' or one of its dependencies. The system cannot find the specified file. C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets (5473,5): error MSB3073: The command "if /I "Release" == "Release" "C:\Program Files (x86)\Eazfuscator.NET\Eazfuscator.NET.exe" "E:\Builds\MyDll\bin\Release\MyDll.dll" --msbuild-project-path "E:\Builds\MyDll\MyDll.csproj" --msbuild-project-configuration "Release" --msbuild-project-platform "AnyCPU" --msbuild-solution-path "*Undefined*" -n --newline-flush -v 2018.2" exit with code 1.
根因与修复方案
- 版本兼容问题:Eazfuscator.NET 2018.2发布时间较早,没有适配Visual Studio 2019 16.x版本推出的强名称编译、中间临时程序集生成逻辑。报错里提到的
zx_2cba06c4237a413ea1e8116e71ad61dc是VS2019编译过程中生成的、仅存在于内存中的带随机强名称的临时程序集,不会持久化保存到磁盘上,Eazfuscator在自动递归扫描项目依赖时会错误识别这类临时引用,直接触发“找不到指定文件”的异常。 - 构建参数缺失:从日志中
--msbuild-solution-path "*Undefined*"的参数值可以判断,当前构建是直接调用MSBuild编译单个csproj文件而非完整解决方案文件,Eazfuscator因为缺少解决方案上下文,无法定位依赖程序集的实际搜索路径,扩大了自动扫描的范围,最终匹配到不存在的临时程序集。 - 时序错位:当前Eazfuscator是通过MSBuild内置Target在编译阶段直接触发执行,此时编译流程尚未完全结束,部分临时强名称程序集还残留在编译内存中未被清理,磁盘上的最终输出文件还未完成落盘,导致混淆工具的文件扫描逻辑报错。
可落地修复操作
- 调整构建步骤拆分逻辑:不要依赖Eazfuscator自动注入的MSBuild混淆钩子,在MSBuild编译步骤全部执行完成、项目输出目录所有DLL依赖全部落盘后,单独添加一个命令行构建步骤,手动调用Eazfuscator.exe对最终输出的MyDll.dll执行混淆,同时显式指定依赖搜索路径为项目的Release输出文件夹。
- 补全构建参数:在TeamCity的MSBuild步骤配置中,指定完整的解决方案文件作为构建目标,让Eazfuscator可以正确识别解决方案路径,不再输出
*Undefined*的空参数值,缩小依赖扫描的有效范围。 - 跳过冗余扫描:如果暂时无法升级Eazfuscator版本,可以在对应csproj文件的
<PropertyGroup>节点下添加配置<ObfuscatorSkipAssemblyReferenceScanning>true</ObfuscatorSkipAssemblyReferenceScanning>,跳过Eazfuscator的自动递归依赖扫描逻辑,直接对目标DLL执行混淆流程。 - 权限校验:确认TeamCity构建服务的运行账号对Eazfuscator安装目录、项目构建输出目录有完全读取权限,避免因为权限不足导致文件遍历异常,误报找不到文件的错误。
内容的提问来源于stack exchange,提问作者Ejrr1085
相关产品推荐
相关产品推荐

