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";
}
}
答案 0 :(得分:13)
Roslyn就是您所需要的。您可以使用nuget轻松安装它。以下是获取方法体的工作代码:
string GetMethod(string filename, string methodName)
{
var syntaxTree = SyntaxTree.ParseFile(filename);
var root = syntaxTree.GetRoot();
var method = root.DescendantNodes()
.OfType<MethodDeclarationSyntax>()
.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<PropertyDeclarationSyntax>()
.Where(md => md.Identifier.ValueText.Equals(propertyName))
.FirstOrDefault();
var getter = property.AccessorList.Accessors.First(a => a.Kind == SyntaxKind.GetAccessorDeclaration);
return getter.ToString();
}
答案 1 :(得分:1)
您需要一个工具,可以解析源代码,跟踪代码位置,并知道如何在源代码中查找方法(或变量,或任何您关心的名称)。有了它,找到感兴趣的线条非常容易。这样的工具不容易构建,因为完整语言的解析器不容易构建。查找功能也不容易;参数,名称空间,模板,继承都结合起来使现代语言的名称查找非常复杂。
程序转换(PT)工具(通常已经有这样的完整解析器)通常通过在内存中构建代表代码的AST来实现。然后,给定名称查找的规则,通过名称查找AST中的代码相对简单,并且可以使用这种工具的prettyprinter函数将命名实体打印到缓冲区/字符串/磁盘文件中,无论您希望它驻留在哪里
您不太可能找到PT作为可以直接从C#调用的子程序。您可以从程序中调用此类工具,并将其作为文本结果/文件结果/通过管道返回,无论您认为哪种方式最适合进程间通信。
如果要显示HTML页面中嵌入的方法文本,通常可以配置PT以生成包含prettyprinted实体文本的整个页面。 (有关此示例,请参阅我的bio的JavaSource浏览器。)
答案 2 :(得分:0)
.NET Reflection类不支持反编译为C#。您可以做的最好的事情是使用MMethodInfo.GetMethodBody()
并在响应中调用MethodBody.GetILAsByteArray()
。那个will give you the MSIL是.NET反射能给你的最好的。
要反编译为C#,您需要一个反编译器 - 其中至少有十几个合法选项。您需要调查符合您要求和预算的内容。
一个选项是Red Gate's .NET Reflector。尼克哈里森有long and thorough article on using .NET Reflector in an application to render source code as HTML。