【问题标题】:Can I change value of constant in C#?我可以在 C# 中更改常量的值吗?
【发布时间】:2011-05-30 09:24:58
【问题描述】:

对于无法重新编译的旧版 .NET dll,我需要此 hack。一些黑客例如使用反射等。

【问题讨论】:

  • 哦,天哪,想象一下创建一个常数非常数之后会出现的混乱。它甚至可能让猫王回来。
  • 您需要更改该值以便在 dll 内部使用还是仅在 dll 外部引用使用它的地方使用?
  • 是的,我可以想象。这就是我谈论黑客的原因。
  • 我希望你没有因为我的玩笑而生气;我真的应该包括一个笑脸。这是一个很好的问题,有很多有趣的含义值得思考(所以我投了赞成票)。

标签: c# reflection


【解决方案1】:

如果程序集没有签名,那么您可以反汇编并修改 IL 并重新编译,或者反汇编为源代码并修改并重新编译。我会找到合适的链接....

要反汇编为源代码,您可以使用reflector(警告-不再免费)和Dennis Bauers plugin,或者您可以使用reflexil,这是另一个反射器插件,带有完整的VB/C#编辑器和智能感知允许代码直接从反射器注入。

要反汇编为 IL,您可以使用 ILSpy 反汇编程序或 MSILDissasembler

正如其他人指出的那样,尽管您想仔细考虑这样做的含义。它可能有更多你意识到的连锁反应。

另一件非常重要的事情是,如果其他引用您正在重新编译的 dll 的 dll 使用该常量,那么这些 dll 不会在不重新编译的情况下看到该常量的新值

这是因为当某些东西被定义为常量时,“常量”值作为优化被烘焙到引用的 dll 中(因此每次使用时都不需要在引用的 dll 中查找)在构建时,因此在任何引用“常量”的库中都不会真正看到对“常量”值的更改。有关更多详细信息,请参阅this question 和答案。

【讨论】:

  • JustDecompile 是免费的并且支持 reflexil。
【解决方案2】:

添加到 Stecya 的答案:
const 变量的值将被插入到任何使用它的地方。这意味着所有引用旧程序集并使用该常量的程序集也需要重新编译以反映 const 变量的更新值。这就是为什么总是通过公共接口中的普通属性公开常量值是个好主意的原因。

【讨论】:

  • 这是我希望我可以投票两次的答案之一;一票指出需要重新编译消费代码,一票赞成“不要直接公开常量”。
  • 是的 +1 总是通过属性公开常量。
【解决方案3】:

您不能更改 const,因为它是在编译时计算的。唯一的方法是更改​​ const 文件是修改旧程序集

【讨论】:

    【解决方案4】:

    反射不起作用,因为该值以反射无法修改的方式硬编码到应用程序的字节码中。

    如果没有经过代码签名,请使用十六进制编辑器或 ILDasm 修改常量的值。

    如果是代码签名的,如果没有前面的代码签名,你就无法解决这个问题。

    如果您正在编辑已编译的程序集,请小心。您也可能有法律原因不能这样做。

    【讨论】:

      【解决方案5】:

      const 值在编译期间被替换为文字,因此您不太可能在不重新编译的情况下更改它

      【讨论】:

        猜你喜欢
        • 2020-11-26
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2019-08-09
        • 2014-12-23
        相关资源
        最近更新 更多