从.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的长篇文章 。