合并库类型重命名问题:如何迁移类型至指定命名空间并保持公开
解决ILMerge合并时类型命名空间迁移并保留公开性的问题
我之前在处理ILMerge合并程序集的时候,刚好碰到过和你一模一样的问题——内部化禁用生效了,但类型的命名空间死活迁移不过去。结合当时踩的坑,给你几个可行的调整方案:
1. 修正类型重命名的特性语法
你原来的第二行特性配置,大概率是语法细节出了问题,不同混淆工具(比如ConfuserEx、Dotfuscator)对类型重命名的特性语法要求略有差异。试试把第二行改成下面两种写法之一:
写法一(通用重命名模式)
[assembly: Obfuscation(Feature = "type renaming pattern Merged.SourceNamespace.Type -> Main.TargetNamespace.Type", Exclude = false)]
写法二(明确指定目标类型)
[assembly: Obfuscation(Feature = "Apply to type Merged.SourceNamespace.Type: rename to Main.TargetNamespace.Type", Exclude = false)]
这个写法更清晰地指定了要修改的目标类型,很多工具对这种明确的指令支持更好。
2. 确保内部化排除文件配置正确
你第一行配置里的/internalize:exclude.file,一定要保证exclude.file文件里准确列出了要保留公开的类型,每行一个完整的类型名,比如:
Merged.SourceNamespace.Type
ILMerge只会保留这个文件里列出的类型的public访问级别,只有类型保持公开,后续的命名空间迁移才能被正确应用。
3. 检查工具的执行顺序
很多混淆合并工具的操作顺序是关键:必须先执行类型重命名(命名空间迁移),再执行ILMerge的内部化合并操作。如果顺序反了,先把类型内部化再重命名,工具可能会忽略重命名指令。你需要在工具的配置里确认,类型重命名步骤排在ILMerge合并之前。
4. 验证合并结果
调整完配置后,用dnSpy这类反编译工具打开合并后的程序集,确认三个关键点:
Main.TargetNamespace.Type是否存在- 该类型的访问修饰符是否为
public - 原程序集中引用
Merged.SourceNamespace.Type的代码是否都被正确重定向到新命名空间
如果上述特性配置还是不生效,还有个手动兜底方案:先用ildasm导出合并库的IL代码,手动修改类型的命名空间后,再用ilasm重新编译,最后和主库执行ILMerge合并。不过这个方法比较繁琐,优先推荐特性配置的方式。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

