对于无法重新编译的旧版.NET dll,我需要这个hack。一些黑客,例如使用反射等
答案 0 :(得分:17)
如果程序集未签名,那么您可能能够反汇编并修改IL并重新编译,或者反汇编以获取源代码并进行修改和重新编译。我会找到合适的链接......
要反汇编来源,您可以reflector使用Dennis Bauers plugin(警告 - 不再免费),或者您可以使用reflexil这是另一个带有完整VB /的反射器插件C#编辑器和intellisense允许直接从Reflector进行代码注入。
要反汇编到IL,您可以使用ILSpy反汇编程序或MSILDissasembler
正如其他人所指出的那样,你要仔细考虑这样做的含义。它可能会让你意识到更多的连锁反应。
另一件非常重要的事情是,如果其他dll使用常量引用你正在重新编译的dll,那些dll 将不会看到常数的新值而不会被重新编译。
这是因为当某些东西被定义为常量时,'常量'值作为优化被引入到引用dll中(因此每次使用它时都不需要在引用的dll中查找)< strong> AT BUILD TIME 因此,任何引用'常量'的库中都不会实际发现对'常量'值的更改。有关更多详细信息,请参阅this question和答案。
答案 1 :(得分:10)
加入Stecya的回答:
const变量的值将被插入到使用它的任何地方。这意味着需要重新编译引用旧程序集并使用该常量的所有程序集,以反映const变量的更新值。这就是为什么总是通过公共接口中的普通属性公开常量值是个好主意的原因。
答案 2 :(得分:3)
您无法更改const,因为它是编译时编译的。唯一的方法是改变const域是修改遗留组件
答案 3 :(得分:2)
反射将无效,因为此值以反射无法修改的方式硬编码到应用程序的字节代码中。
如果没有代码签名,请使用十六进制编辑器或ILDasm来修改常量的值。
如果是代码签名,如果没有上述代码签名,则无法解决此问题。
如果您正在编辑已编译的程序集,请小心。可能有法律原因你不能这样做。
答案 4 :(得分:1)
const值在编译期间被替换为文字,因此在不重新编译的情况下,您很可能无法更改它