2016-03-21 6 views
0

明らかに、ICSharpCode Decompilerは、C#コンパイラによってラムダ式のために作成された内部クラスを逆コンパイルしません。次の例を考えてみましょう:ラムダ式のネストされたクラスがICSharpCodeで構文木から抜けているDecompiler

場合によっては、C#のラムダ式はラムダ本体を含むメソッドで内部クラスにコンパイルされます。例えば。このようなC#コード:

class MyClass 
{ 
    public void MyMethod() 
    { 
     Parallel.For(0, 10, i => 
     { 
      ... = 3 * i; 
     }) 
    } 
} 

は、以下のような内部クラスを追加するコンパイラになります:(。そうでないかもしれない、まさにこのようしかし、あなたのアイデアを得る)

class MyClass 
{ 
    public void MyMethod() 
    ... 

    public class c__DisplayClass2() 
    { 
     public int i; 

     public void b__0() 
     { 
      ... = 3 * i; 
     } 
    } 
} 

問題は、ICSharpCode.Decompiler.Ast.AstBuilderを使用してMyClassのアセンブリからASTをプログラムで作成しようとすると、これらの内部クラスはASTに含まれていないことです(他のすべては問題ありません)。 MyClassTypeDeclerationの注釈の中でこれらの生成されたクラスを見ることもできます。タイプMono.Cecil.TypeDefinitionの注釈は、NestedTypesプロパティでこれらの内部クラスを正しくリストします(したがって、アセンブリから正しくロードされました。 、手動で作成された内部クラスは適切に逆コンパイルされます)。

また、私は開かれたこのILSpy問題を参照してください。https://github.com/icsharpcode/ILSpy/issues/686

は、私がここに明らかに何かが足りないのですか?私はGUIを使ってILSpyからアセンブリを見て、問題のコードは適切に逆コンパイルされています(内部クラスではなく、むしろラムダが再構築されます)。

答えて

0

私は問題を発見しました:構文ツリーを操作する前にastBuilder.RunTransformations();を実行する必要があります。その場合、デリゲートも再作成されます。

var assembly = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location); 
var decompilerContext = new DecompilerContext(assembly.MainModule); 
var astBuilder = new AstBuilder(decompilerContext); 
astBuilder.AddAssembly(assembly); 
astBuilder.RunTransformations(); // This is new. 

var syntaxTree = astBuilder.SyntaxTree; 
:構文木が適切にあなたがこれを必要とする初期化するためしかし

var assembly = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location); 
var decompilerContext = new DecompilerContext(assembly.MainModule); 
var astBuilder = new AstBuilder(decompilerContext); 
astBuilder.AddAssembly(assembly); 

var syntaxTree = astBuilder.SyntaxTree; 

:私はこれをしなかった前

関連する問題