从.cs文件获取特定方法源代码(在运行时)

1 –我在光盘上有这个文件内容(cs文件,未编译):

namespace Test { using System; public class TestClass { public string SomeTestMethod(){ return "test here"; } } } 

如何将运行时间输入变量方法:

 public string SomeTestMethod(){ return "test here"; } 

例如: SourceCodeParser.GetMothod("path to file","SomeTestMethod");

2 – 访问者成员的内容是否可能?

  public string SomeMember { get { return "test here"; } } 

罗斯林是你需要的。 您可以使用nuget轻松安装它。 这是获取方法体的工作代码:

 string GetMethod(string filename, string methodName) { var syntaxTree = SyntaxTree.ParseFile(filename); var root = syntaxTree.GetRoot(); var method = root.DescendantNodes() .OfType() .Where(md => md.Identifier.ValueText.Equals(methodName)) .FirstOrDefault(); return method.ToString(); } 

以及获取属性getter的代码:

 string GetPropertyGetter(string filename, string propertyName) { var syntaxTree = SyntaxTree.ParseFile(filename); var root = syntaxTree.GetRoot(); var property = root.DescendantNodes() .OfType() .Where(md => md.Identifier.ValueText.Equals(propertyName)) .FirstOrDefault(); var getter = property.AccessorList.Accessors.First(a => a.Kind == SyntaxKind.GetAccessorDeclaration); return getter.ToString(); } 

您需要一个工具,可以解析源代码,跟踪代码位置,并知道如何在源代码中查找方法(或变量,或任何您关心的名称)。 有了它,找到感兴趣的线条非常容易。 这样的工具不容易构建,因为完整语言的解析器不容易构建。 查找function也不容易; 参数,命名空间,模板,inheritance都结合起来使现代语言的名称查找非常复杂。

程序转换(PT)工具(通常已经有这样的完整解析器)通常通过在内存中构建代表代码的AST来实现。 然后,给定名称查找的规则,通过名称查找AST中的代码相对简单,并且可以使用这种工具的prettyprinter函数将命名实体打印到缓冲区/字符串/磁盘文件中,无论您希望它驻留在哪里。

您不太可能找到PT作为可以直接从C#调用的子例程。 您可以从程序中调用此类工具,并将其作为文本结果/文件结果/通过管道返回,无论您认为哪种方式最适合进程间通信。

如果要显示HTML页面中嵌入的方法文本,通常可以配置PT以生成包含prettyprinted实体文本的整个页面。 (通过我的bio查看JavaSource浏览器,例如这样)。

.NET Reflection类不支持反编译为C#。 您可以做的最好的事情是使用MMethodInfo.GetMethodBody()并在响应上调用MethodBody.GetILAsByteArray() 。 这将为您提供 .NETreflection可以为您提供的最佳MSIL 。

要反编译为C#,您需要一个反编译器 – 其中至少有十几个合法选项。 您需要调查满足您的要求和预算的那个。

一个选项是Red Gate的.NET Reflector 。 Nick Harrison有一篇关于在应用程序中使用.NET Reflector将源代码呈现为HTML的长篇文章 。