小编Kry*_*lik的帖子

要求Reflection API覆盖System.String.Empty的含义是什么?

我偶然发现了这段代码:

static void Main()
{
    typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF

    Console.WriteLine(String.Empty);//check

    //how does it behave?
    if ("evil" == String.Empty) Console.WriteLine("equal"); 

    //output: 
    //evil 
    //equal

 }
Run Code Online (Sandbox Code Playgroud)

我想知道如何编译这段代码甚至是可能的.我的理由是:

根据MSDN String.Empty是只读的,因此更改它应该是不可能的,并且编译应以"无法分配静态只读字段"或类似错误结束.

我认为Base Class Library程序集以某种方式受到保护和签名,以及什么可以防止这种攻击.下次有人可能会更改System.Security.Cryptography或其他关键类.

我认为基类库程序集是在安装.NET之后由NGEN编译的,因此更改String类的字段应该需要高级黑客并且要困难得多.

然而,这段代码编译和工作.有人可以解释我的推理有什么问题吗?

.net c# reflection

61
推荐指数
4
解决办法
2900
查看次数

标签 统计

.net ×1

c# ×1

reflection ×1