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

C# Roslyn可以从对象实例生成源代码吗?,c#,roslyn,visual-studio-2015,C#,Roslyn,Visual Studio 2015,在Visual Studio 2015中使用Roslyn API,可以将对象实例转换为源代码吗?我是否可以创建一个扩展方法,如“.ToSourceCode()”,如下所示 class Foo{} 班级计划 { 静态字符串classSourceCode=“class Foo{}”; 静态void Main() { var instance=newfoo(); var instanceSourceCode=instance.GetType().ToSourceCode(); System.Diagn

在Visual Studio 2015中使用Roslyn API,可以将对象实例转换为源代码吗?我是否可以创建一个扩展方法,如“.ToSourceCode()”,如下所示

class Foo{}
班级计划
{
静态字符串classSourceCode=“class Foo{}”;
静态void Main()
{
var instance=newfoo();
var instanceSourceCode=instance.GetType().ToSourceCode();
System.Diagnostics.Debug.Assert(instanceSourceCode==classSourceCode);
}
}

否。但是,ILSpy可以

根据对这个问题的评论和我对Roslyn的理解,反编译是不受支持的。然而,多亏了@Bradley的ILSpy技巧,有了一个解决方案:

  • 从下载ILSpy二进制文件
  • 参考以下程序集:ICSharpCode.Decompiler.dll、ILSpy.exe、Mono.Cecil.dll、ILSpy.BamlDecompiler.Plugin.dll
  • 实现“.ToSourceCode()”扩展方法,如下所示:
  • 使用系统;
    使用System.Linq;
    运用系统反思;
    使用System.Text.RegularExpressions;
    使用ICSharpCode.Decompiler;
    使用ICSharpCode.ILSpy;
    使用单盲法;
    类Foo{}
    班级计划
    {
    静态字符串classSourceCode=“使用系统;内部类Foo{}”;
    静态void Main()
    {
    var instance=newfoo();
    var instanceSourceCode=instance.GetType().ToSourceCode();
    System.Diagnostics.Debug.Assert(instanceSourceCode==classSourceCode);
    }
    }
    静态类类型扩展
    {
    公共静态字符串到源代码(此类型源)
    {
    var assembly=AssemblyDefinition.ReadAssembly(assembly.getExecutionGassembly().Location);
    var type=assembly.MainModule.Types.FirstOrDefault(t=>t.FullName==source.FullName);
    if(type==null)返回字符串.Empty;
    var plainTextOutput=新的plainTextOutput();
    var decompiler=新的CSharpLanguage();
    decompiler.DecompileType(类型,明文输出,新的反编译选项());
    返回Regex.Replace(Regex.Replace(plainTextOutput.ToString(),@“\n|\r”,”,@“\s+”,”);
    }
    }
    
    否。但是,ILSpy可以

    根据对这个问题的评论和我对Roslyn的理解,反编译是不受支持的。然而,多亏了@Bradley的ILSpy技巧,有了一个解决方案:

  • 从下载ILSpy二进制文件
  • 参考以下程序集:ICSharpCode.Decompiler.dll、ILSpy.exe、Mono.Cecil.dll、ILSpy.BamlDecompiler.Plugin.dll
  • 实现“.ToSourceCode()”扩展方法,如下所示:
  • 使用系统;
    使用System.Linq;
    运用系统反思;
    使用System.Text.RegularExpressions;
    使用ICSharpCode.Decompiler;
    使用ICSharpCode.ILSpy;
    使用单盲法;
    类Foo{}
    班级计划
    {
    静态字符串classSourceCode=“使用系统;内部类Foo{}”;
    静态void Main()
    {
    var instance=newfoo();
    var instanceSourceCode=instance.GetType().ToSourceCode();
    System.Diagnostics.Debug.Assert(instanceSourceCode==classSourceCode);
    }
    }
    静态类类型扩展
    {
    公共静态字符串到源代码(此类型源)
    {
    var assembly=AssemblyDefinition.ReadAssembly(assembly.getExecutionGassembly().Location);
    var type=assembly.MainModule.Types.FirstOrDefault(t=>t.FullName==source.FullName);
    if(type==null)返回字符串.Empty;
    var plainTextOutput=新的plainTextOutput();
    var decompiler=新的CSharpLanguage();
    decompiler.DecompileType(类型,明文输出,新的反编译选项());
    返回Regex.Replace(Regex.Replace(plainTextOutput.ToString(),@“\n|\r”,”,@“\s+”,”);
    }
    }
    
    还没有查看Rslyn,但如果这是可能的话,那么黑客攻击任何.net程序只需5分钟……是的,你当然可以编写这样的方法。它不是内置在Roslyn中的,Roslyn中也没有什么可以帮助您解决这个问题。是或否问题都会产生糟糕的堆栈溢出问题。你对Roslyn的能力做了哪些研究?您尝试过哪些失败的方法,以及您遇到了哪些与预期行为不同的错误。使用“ToSourceCode”并不是最难的部分,最难的部分是编写“ToSourceCode”。@Robin这个问题在主题上是边缘问题。是/否不是这里允许的问题。所以问题应该是“如何编写ToSourceCode方法?”。但这太宽泛了,因为它需要一篇教程或代码项目文章。我还没有看过Rslyn,但如果可能的话,那么破解任何.net程序只需5分钟……是的,你当然可以编写这样的方法。它不是内置在Roslyn中的,Roslyn中也没有什么可以帮助您解决这个问题。是或否问题都会产生糟糕的堆栈溢出问题。你对Roslyn的能力做了哪些研究?您尝试过哪些失败的方法,以及您遇到了哪些与预期行为不同的错误。使用“ToSourceCode”并不是最难的部分,最难的部分是编写“ToSourceCode”。@Robin这个问题在主题上是边缘问题。是/否不是这里允许的问题。所以问题应该是“如何编写ToSourceCode方法?”。但这太宽泛了,因为它需要一篇教程或代码项目文章。罗宾是绝对正确的。ILSpy是用于已编译代码的分析器的更好示例,它现在是IL形式的。如果您使用他/她的示例,那么请记住,为了重新编译,您还需要反编译或引用它引用的对象的所有类型-无论是在内部实现中还是在其部分签名中(例如,超类型、返回类型、参数类型)。Roslyn旨在分析C#和VB源代码,尽管它有理解来自引用IL程序集的签名的工具,但没有方法实现。回答得很好!我将这样定义程序集
    var assembly=AssemblyDefini