C# 如何从roslyn的语义模型中获取符号信息?
我试图在Roslyn中创建一个代码分析器,我需要分析项目中SqlCommand的使用情况。我已经编写了分析器,当我在Visual Studio项目中测试它时,它工作得很好,但是当我编写单元测试时,我试图从C# 如何从roslyn的语义模型中获取符号信息?,c#,roslyn,C#,Roslyn,我试图在Roslyn中创建一个代码分析器,我需要分析项目中SqlCommand的使用情况。我已经编写了分析器,当我在Visual Studio项目中测试它时,它工作得很好,但是当我编写单元测试时,我试图从SemanticModel获取SymbolInfo,并且总是得到null 我错过了什么 string test = @"public class TestClass { public void SomeMethod(int
SemanticModel
获取SymbolInfo
,并且总是得到null
我错过了什么
string test = @"public class TestClass
{
public void SomeMethod(int x)
{
var command = new SqlCommand(""Some COmmabnd"",new SqlConnection(""conn string""));
command.ExecuteReader();
}
}";
var tree = CSharpSyntaxTree.ParseText(test);
var systemDataReference = MetadataReference.CreateFromFile(typeof(System.Data.IDbCommand).Assembly.Location);
var systemConfigurationReference = MetadataReference.CreateFromFile(typeof(ConfigurationManager).Assembly.Location);
var systemTransactionReference = MetadataReference.CreateFromFile(typeof(Transaction).Assembly.Location);
var systemXmlnReference = MetadataReference.CreateFromFile(typeof(XPathDocument).Assembly.Location);
var system = MetadataReference.CreateFromFile(typeof(Uri).Assembly.Location);
var mscorRef = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var systemCore = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);
var systemNumerics = MetadataReference.CreateFromFile(typeof(BigInteger).Assembly.Location);
var compilation = CSharpCompilation.Create("TestCompilatin", new[] {tree},
new[]
{
mscorRef, system, systemXmlnReference, systemTransactionReference, systemDataReference,
systemConfigurationReference,systemCore,systemNumerics
});
var semanticModel = compilation.GetSemanticModel(tree);
var invocationExpressions = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>();
foreach (var invocationExpressionSyntax in invocationExpressions)
{
var memeber = invocationExpressionSyntax.Expression as MemberAccessExpressionSyntax;
var symbolInfo = semanticModel.GetSymbolInfo(memeber);
}
string test=@“公共类TestClass
{
公共方法(int x)
{
var command=new-SqlCommand(“'Some-COmmabnd”“,new-SqlConnection('conn-string”“);
command.ExecuteReader();
}
}";
var-tree=CSharpSyntaxTree.ParseText(测试);
var systemDataReference=MetadataReference.CreateFromFile(typeof(System.Data.IDbCommand).Assembly.Location);
var systemConfigurationReference=MetadataReference.CreateFromFile(typeof(ConfigurationManager.Assembly.Location);
var systemTransactionReference=MetadataReference.CreateFromFile(typeof(Transaction.Assembly.Location));
var systemXmlnReference=MetadataReference.CreateFromFile(typeof(XPathDocument).Assembly.Location);
var system=MetadataReference.CreateFromFile(typeof(Uri).Assembly.Location);
var mscorRef=MetadataReference.CreateFromFile(typeof(object.Assembly.Location));
var systemCore=MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);
var systemNumerics=MetadataReference.CreateFromFile(typeof(biginger).Assembly.Location);
var compilation=csharpcomilation.Create(“TestCompilatin”,new[]{tree},
新[]
{
mscorRef,系统,系统xmlnreference,系统事务引用,系统数据引用,
systemConfigurationReference、systemCore、systemNumerics
});
var semanticModel=compilation.GetSemanticModel(树);
var invocationExpressions=tree.GetRoot().degenantnodes().OfType();
foreach(调用表达式中的var调用表达式syntax)
{
var memeber=invocationExpressionSyntax。表达式为MemberAccessExpressionSyntax;
var symbolInfo=semanticModel.GetSymbolInfo(memeber);
}
semanticModel.GetSymbolInfo()
返回SymbolInfo
,对于我尝试的任何内容,都使用空符号 另一个可能的原因是调用的方法的源文件尚未进行语法分析并添加到编译中。您总是可以在调用方的语法树中获得有关调用的方法的一些信息,但是除非调用的方法已经添加到编译中,否则它在语义模型中不可用。经过一段时间的思考,这是显而易见的。当然,语义模型不会有关于尚未处理的方法的信息。可以使用AddSyntaxTrees()方法将多个语法树添加到单个编译中。请注意,此方法返回一个新的编译实例
希望这能为某人节省一点时间,我也没有因为发布这个答案而感到太尴尬。另一个可能的原因是调用的方法的源文件没有被语法解析并添加到编译中。您总是可以在调用方的语法树中获得有关调用的方法的一些信息,但是除非调用的方法已经添加到编译中,否则它在语义模型中不可用。经过一段时间的思考,这是显而易见的。当然,语义模型不会有关于尚未处理的方法的信息。可以使用AddSyntaxTrees()方法将多个语法树添加到单个编译中。请注意,此方法返回一个新的编译实例
希望这能为大家节省一点时间,我也没有因为发布这个答案而感到太尴尬。检查编译错误。谢谢@SLaks,我错过了添加using语句。我希望roslyn编译会抛出错误,看起来我错了。@SriHarshaVelicheti您是如何解决此问题的?检查编译错误。谢谢@SLaks,我没有添加using语句。我希望roslyn编译会抛出错误,看起来我错了。@SriHarshaVelicheti您是如何解决此问题的?