我可以改变C#中常数的值吗?

我可以改变C#中常数的值吗?,c#,reflection,C#,Reflection,我需要对无法重新编译的遗留.NET dll进行此攻击。一些黑客行为,例如使用反射等。如果程序集未签名,则您可能可以分解和修改IL并重新编译,或者分解以获取源代码并进行修改和重新编译。我会找到合适的链接 要反汇编到源代码,您可以使用(警告-不再免费),也可以使用reflector的另一个插件,该插件带有完整的VB/C编辑器和intellisense,允许直接从reflector注入代码 要拆卸到IL,可以使用拆卸器或 正如其他人指出的那样,尽管你想仔细考虑做这件事的含义。它可能会有更多你意识到的敲

我需要对无法重新编译的遗留.NET dll进行此攻击。一些黑客行为,例如使用反射等。

如果程序集未签名,则您可能可以分解和修改IL并重新编译,或者分解以获取源代码并进行修改和重新编译。我会找到合适的链接

要反汇编到源代码,您可以使用(警告-不再免费),也可以使用reflector的另一个插件,该插件带有完整的VB/C编辑器和intellisense,允许直接从reflector注入代码

要拆卸到IL,可以使用拆卸器或

正如其他人指出的那样,尽管你想仔细考虑做这件事的含义。它可能会有更多你意识到的敲门声

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


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

不能更改常量,因为它是编译时计算的。唯一的方法是更改const字段,即修改旧程序集反射无法工作,因为此值以反射无法修改的方式硬编码到应用程序的字节码中

如果不是代码签名,请使用十六进制编辑器或ILDasm修改常量的值

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


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

常量值在编译时被替换为文本,因此您不可能在不重新编译的情况下对其进行更改。

添加到Stecya的答案中:

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

哦,亲爱的,想象一下,使常量变为非常量会带来混乱。它甚至可能会把Elvis带回来。您是否需要更改该值以便在dll内部使用,或者仅在dll外部引用使用该值的情况下使用?是的,我可以想象。这就是为什么我要谈论黑客。我希望你没有因为我的笑话而生气;我真的应该加上一个笑脸。这是一个很好的问题,有很多有趣的含义需要思考(所以我投了更高的票);一票赞成指出需要重新编译消费代码,一票赞成“不直接公开常量”。是+1票赞成“始终通过属性公开常量”。JustDecompile是免费的,支持Reflectil。