You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并库类型重命名问题:如何迁移类型至指定命名空间并保持公开

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:10:33