Roslyn可以从对象实例生成源代码吗?

Rob*_*bin 4 c# roslyn vs-2015-preview

在Visual Studio 2015中使用Roslyn API,我可以将对象实例转换为源代码吗?我可以创建像".ToSourceCode()"这样的扩展方法,如下所示吗?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*bin 12

不.但是,ILSpy可以.

根据对问题的评论和我对Roslyn的理解,不支持反编译.但是,感谢@ Bradley的ILSpy提示,有一个解决方案:

  1. http://ilspy.net/下载ILSpy二进制文件
  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+", " ");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 罗宾是完全正确的.ILSpy是已编译代码的分析器的一个更好的例子,现在是IL形式.如果您使用他/她的示例,请记住,为了重新编译,您还需要反编译或引用它引用的所有对象的类型 - 无论是在内部实现还是部分签名(例如超类型,返回类型) ,参数类型).Roslyn用于分析C#和VB源代码,但它具有用于理解来自引用的IL程序集的签名的工具,但不具有方法实现的功能. (2认同)