是否可以指示C#编译器不对常量进行内联处理?
可行解决方案
以下两种方案都不需要修改任何业务源代码,仅调整构建配置即可实现常量不内联,方便你通过二进制分析识别依赖:
方案1:全局关闭编译优化
C#编译器的常量内联属于默认开启的编译优化项,直接禁用编译优化即可阻止绝大多数常量内联行为:
- 使用dotnet CLI构建时添加参数:
dotnet build /p:Optimize=false - 使用MSBuild直接构建时添加参数:
msbuild /p:Optimize=false - 如需对整个解决方案的所有项目统一生效,可以在解决方案根目录新增
Directory.Build.props文件,加入以下配置:
<Project> <PropertyGroup> <Optimize>false</Optimize> </PropertyGroup> </Project>
该方案实现最简单,生成的程序集中所有const常量都会保留完整的元数据引用,不会被替换为字面量,可直接通过Mono.Cecil等工具识别到常量的依赖关系,适合仅用于依赖分析的构建场景。
方案2:使用peverify兼容编译参数
如果你需要构建的程序集同时兼顾运行性能,不想全量关闭所有编译优化,可以使用C#编译器的/features:peverify-compat参数:
该参数原本是为了兼容旧版PE验证工具设计的,附带效果就是会禁用常量内联优化,其他编译优化项会正常生效,对程序运行性能影响极小。
使用时只需在构建参数中加入/p:Features=peverify-compat即可。
流程建议
你可以单独搭建一条用于依赖分析的专属构建流水线,专门使用上述参数生成分析用的程序集,分析完成后直接丢弃即可,完全不会影响原有正常发布流程的配置和产物。
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

