如何将.net dll反编译为项目c#[CompilerGenerated]

时间:2018-05-19 23:46:49

标签: c# decompiling

使用dotpeek反编译dll时我得到了这段代码

      [CompilerGenerated]
    private static class <Importuj>o__SiteContainer0
    {
      public static CallSite<Func<CallSite, object, Worksheet>> <>p__Site1;
      public static CallSite<Func<CallSite, object, bool>> <>p__Site2;
      public static CallSite<Func<CallSite, object, object, object>> <>p__Site3;
      public static CallSite<Func<CallSite, object, Range>> <>p__Site4;
      public static CallSite<Func<CallSite, object, bool>> <>p__Site5;
      public static CallSite<ImportExcel.<Importuj>o__SiteContainer0.<>q__SiteDelegate6> <>p__Site7;
      public static CallSite<Func<CallSite, object, object>> <>p__Site8;
      public static CallSite<Func<CallSite, object, Range>> <>p__Site9;

...

}

如何解决这个问题并构建项目?

1 个答案:

答案 0 :(得分:2)

首先,您需要了解此编译器生成的类的作用是什么,它是什么,以及它与生成它的代码的关系。

对于这些调用站点对象,它们通常用于使用dynamic值的代码。在没有详细说明的情况下,运行时需要此信息才能在处理dynamic时发挥作用。

如,

dynamic something = ...;
// any code that involves the variable `something` will generate call site information

一般来说,当运行时需要引用动态变量时,就好像它是某个特定类型或对象一样,它将创建一个调用站点对象。它将针对涉及动态变量的每个子表达式执行此操作。

int someInt = something.SomeInt; // some property that returns int
// CallSite<Func<CallSite, Object, Int32>>

something.SomeMethod();          // some object that has some method `SomeMethod()`
// CallSite<Func<CallSite, Object, Object>>

SomeValue x = something[123];    // some indexer that takes an int,
                                 // that returns something that might be SomeValue
// CallSite<Func<CallSite, Object, Int32, Object>>
//     and CallSite<Func<CallSite, Object, SomeValue>>

了解这一点,找出这些字段的使用位置,并尝试将涉及该字段的表达式转换为遵循这些模式使用dynamic