我可以在C#中更改常量值吗?

我需要这个无法重新编译的.NET dll的hack。 一些黑客例如使用reflection等。

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

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

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

正如其他人所指出的那样,你要仔细考虑这样做的含义。 它可能会让你意识到更多的连锁反应。

另一件非常重要的事情是,如果其他dll使用的常量引用你正在重新编译的dll,那些dll 将不会看到常量的新值而不会被重新编译。

这是因为当某些东西被定义为常量时,’常量’值作为优化被引入到引用dll中(因此每次使用时都不需要在引用的dll中查找) AT BUILD TIME所以在引用“常量”的任何库中都不会实际看到对“常量”值的更改。 有关详细信息,请参阅此问题和答案。

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

您无法更改const,因为它是编译时计算的。 唯一的方法是改变const域是修改遗留组件

reflection将无法工作,因为此值以reflection无法修改的方式硬编码到应用程序的字节代码中。

如果未进行代码签名,请使用hex编辑器或ILDasm来修改常量的值。

如果是代码签名,则无法在没有前面的代码签名的情况下解决此问题。

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

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