DotNet Reflector - 为什么我不能反汇编XmlHierarchicalEnumerable?

时间:2010-02-16 04:39:44

标签: c# .net reflector

请注意,以下是dotNet反射器无法正确拆卸的罕见情况的示例。在绝大多数情况下,它完美地工作,我并不认为这必然是反射器中的错误。它可能是有问题的程序集上的保护或混淆或非托管代码的结果。

我尝试在dotnet反射器中反汇编System.Web.UI.WebControls.XmlHierarchicalEnumerable。仿制药似乎搞砸了,例如:

// Nested Types
[CompilerGenerated]
private sealed class GetEnumerator>d__0 : IEnumerator<object>, 
    IEnumerator, IDisposable
{
    // Fields
    private int <>1__state;
    private object <>2__current;
    public XmlHierarchicalEnumerable <>4__this;
    public IEnumerator <>7__wrap2;
    public IDisposable <>7__wrap3;
    public XmlNode <node>5__1;

在其他集会中,我有时会得到小方块(我知道这些通常代表'未知符号')代替类名,例如:

    dictionary1.Add("autopostbackonselect", 0x34);
    ᜀ.ᜌ = dictionary1;
}

if (ᜀ.ᜌ.TryGetValue(key, out num))
{
    switch (num)

是什么给出的?谁知道?

4 个答案:

答案 0 :(得分:4)

在第一个例子中,完全可以预料到这一点。使用IEnumerable<T>语句时,这些类用于实现yield return。它会生成存储状态的类,并在MoveNext实现输出的IEnumerator<T>实例上调用IEnumerable<T>.GetEnumerator时获取新值(您将注意到它们是同一个)。 / p>

应该注意的是,您所看到的是从CLR角度来看完全合法的命名语法。但从C#的角度来看,这是不合法的。但是,由于这些类是内部的,您永远不需要直接访问它们(仅通过接口实现),因此不需要它们是合法的C#名称。

至于第二种,我没有看到这种行为,可能是程序集被混淆了,但我在.NET中没有看到任何版本。如果您澄清了正在查看的.NET框架版本的程序集(.NET框架与否),以及您正在使用的反射器版本,那么它会有所帮助。

答案 1 :(得分:1)

在查看Obfuscated的程序集之前,我已经看到了这一点。通常在此过程中,变量名称对人眼来说是不可读的,因此会导致未知字符。

答案 2 :(得分:0)

此程序集可能已经过模糊处理,您可以查看这些链接http://cooprotector.com/ http://intelliside.com/

答案 3 :(得分:0)

编译器自动生成了很多东西。基于枚举器块的自动属性,匿名类型/方法和计算器。他们都需要一个名字,而且应该是一个不会被开发者与某些名字冲突的名字。由于&lt;&gt; _在CLR术语中是完全合法的名称,但在C#中没有任何自动生成并用&lt;&gt; _命名的内容,因此确保编译器不会意外地选择开发人员已经使用的名称。