C# Roslyn可以从对象实例生成源代码吗?
在Visual Studio 2015中使用Roslyn API,可以将对象实例转换为源代码吗?我是否可以创建一个扩展方法,如“.ToSourceCode()”,如下所示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
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技巧,有了一个解决方案:
使用系统;
使用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技巧,有了一个解决方案:
使用系统;
使用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