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

dnSpy中引入的引用程序集会对重编译结果产生什么影响?

dnSpy重编译引用程序集相关问题解答

重编译时选择的引用是否会修改最终输出的DLL

会。
只要你在dnSpy中触发代码段重编译,无论是否修改业务逻辑,最终生成的DLL的程序集引用元数据都会根据你编译时提供的引用集更新。
dnSpy要求提供引用的核心原因是C#编译器编译时必须完成所有类型、成员的签名解析:哪怕你没修改涉及该引用的逻辑,只要当前编译的代码段中存在对该引用集内类型、成员的调用,编译器就必须读取对应程序集的元数据来确认签名正确性,否则无法完成编译,这个要求和你是否修改相关功能没有关系。

不同版本引用下最终运行时的加载规则

最终加载哪个版本分核心场景判断:

  • 如果你重编译时提供的引用和原始DLL编译时用的版本完全匹配(版本号、公钥标记、文化信息完全一致)
    编译后DLL的引用元数据和原始文件完全一致,运行时的加载行为和重编译前没有任何区别,会加载原始设计适配的版本。
  • 如果你重编译时提供的是其他版本的引用程序集
    编译完成后,输出DLL的元数据中记录的对应程序集引用信息会更新为你提供的版本的信息(包括版本号、公钥标记):
    • 默认无特殊配置的场景下,运行时会优先加载元数据中记录的对应版本的程序集
    • 如果你提供的版本和原始版本公开API签名不兼容(比如你用到的方法在新版本中被删除、改了参数),哪怕你没改任何业务代码,运行时也会抛出TypeLoadException、MissingMethodException类的错误,因为编译器是按照你提供的版本生成的成员引用签名,和实际加载版本的签名对不上
    • 如果程序配置了程序集绑定重定向(比如配置文件中写了bindingRedirect规则,或者程序域挂载了自定义的程序集解析逻辑),最终加载版本会优先遵循重定向规则,不会严格按照DLL元数据中记录的版本加载。

实操提示:如果只是做小范围的代码修改,不想破坏原有程序的加载逻辑,重编译时尽量选择和原始引用版本完全一致的程序集,不要随意用其他版本凑数,避免出现编译通过但运行时崩溃的问题。

内容的提问来源于stack exchange,提问作者Gumpf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:45:39