2015-04-10 3 views
2

Используя API Roslyn с Visual Studio 2015, можно ли преобразовать экземпляр объекта в исходный код? Могу ли я создать метод расширения типа «.ToSourceCode()», как показано ниже?Может ли Roslyn генерировать исходный код из экземпляра объекта?

class Foo { } 
class Program 
{ 
    static string classSourceCode = "class Foo { }"; 
    static void Main() 
    { 
     var instance = new Foo(); 
     var instanceSourceCode = instance.GetType().ToSourceCode(); 
     System.Diagnostics.Debug.Assert(instanceSourceCode == classSourceCode); 
    } 
} 
+0

не взглянули на Rslyn, но если это возможно, то взлом ANY. чистая программа было бы всего лишь 5 минут ... – Gusman

+0

Да, вы, безусловно, можете написать такой метод. Он не встроен в Рослин, и в Рослине мало что поможет вам в этом. – usr

+1

Да или нет, вопросы задают проблемы с переполнением стека. Какие исследования вы сделали о возможностях Рослина? Что вы пробовали, что не удалось, и какие ошибки вы получаете, которые отличаются от ожидаемого поведения. –

ответ

8

No. Однако, ILSpy может.

Основываясь на комментариях к вопросу и о том, что я понимаю о Roslyn, декомпиляция не поддерживается. Однако, благодаря @ Брэдлите ILSpy наконечника, есть решение:

  1. Скачать ILSpy двоичных файлов из http://ilspy.net/
  2. справочного следующих узлов: ICSharpCode.Decompiler.dll, ILSpy.exe, Mono.Cecil.dll, ILSpy.BamlDecompiler.Plugin.dll
  3. Реализовать «.ToSourceCode()» метод расширения, как показано ниже:
using System; 
using System.Linq; 
using System.Reflection; 
using System.Text.RegularExpressions; 
using ICSharpCode.Decompiler; 
using ICSharpCode.ILSpy; 
using Mono.Cecil; 
class Foo { } 
class Program 
{ 
    static string classSourceCode = "using System; internal class Foo { } "; 
    static void Main() 
    { 
     var instance = new Foo(); 
     var instanceSourceCode = instance.GetType().ToSourceCode(); 
     System.Diagnostics.Debug.Assert(instanceSourceCode == classSourceCode); 
    } 
} 

static class TypeExtensions 
{ 
    public static string ToSourceCode(this Type source) 
    { 
     var assembly = AssemblyDefinition.ReadAssembly(Assembly.GetExecutingAssembly().Location); 
     var type = assembly.MainModule.Types.FirstOrDefault(t => t.FullName == source.FullName); 
     if (type == null) return string.Empty; 
     var plainTextOutput = new PlainTextOutput(); 
     var decompiler = new CSharpLanguage(); 
     decompiler.DecompileType(type, plainTextOutput, new DecompilationOptions()); 
     return Regex.Replace(Regex.Replace(plainTextOutput.ToString(), @"\n|\r", " "), @"\s+", " "); 
    } 
} 
+2

Робин абсолютно прав. ILSpy - лучший пример анализатора для уже скомпилированного кода, который теперь находится в форме IL. Если вы используете свой пример, то имейте в виду, что для перекомпиляции вам также необходимо декомпилировать или ссылаться на все типы этого объекта, которые он ссылается, - как во внутренней реализации, так и в части ее подписи (например,супертипы, типы возврата, типы параметров). Roslyn предназначен для анализа исходного кода C# и VB, хотя он имеет возможности для понимания подписей от ссылок IL-ассамблеи, но не реализации метода. –

Смежные вопросы