Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn查找对方法的所有引用_C#_Code Analysis_Roslyn_Findall - Fatal编程技术网

C# 使用Roslyn查找对方法的所有引用

C# 使用Roslyn查找对方法的所有引用,c#,code-analysis,roslyn,findall,C#,Code Analysis,Roslyn,Findall,我希望扫描一组.cs文件,以查看哪些文件调用可空的属性的值(查找所有引用)。例如,这将匹配: class Program { static void Main() { int? nullable = 123; int value = nullable.Value; } } 我了解了Roslyn的情况,并查看了一些示例,但其中许多示例已经过时,而且API非常庞大。我该怎么做呢 解析语法树后,我被卡住了。这就是我到目前为止所做的: publi

我希望扫描一组.cs文件,以查看哪些文件调用
可空的
属性的
(查找所有引用)。例如,这将匹配:

class Program
{
    static void Main()
    {
        int? nullable = 123;
        int value = nullable.Value;
    }
}
我了解了Roslyn的情况,并查看了一些示例,但其中许多示例已经过时,而且API非常庞大。我该怎么做呢

解析语法树后,我被卡住了。这就是我到目前为止所做的:

public static void Analyze(string sourceCode)
{
    var tree = CSharpSyntaxTree.ParseText(sourceCode);

    tree./* ??? What goes here? */
}

您可能正在寻找类,特别是方法

听起来你很难熟悉罗斯林。我有一系列的博客帖子来帮助人们认识Roslyn

正如@SLaks提到的,您需要访问我在本文中介绍的语义模型

下面的示例向您展示了如何使用API。如果可以,我将使用
MSBuildWorkspace
从磁盘加载项目,而不是像这样在
AdHocWorkspace
中创建项目

var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var ws = new AdhocWorkspace();
//Create new solution
var solId = SolutionId.CreateNewId();
var solutionInfo = SolutionInfo.Create(solId, VersionStamp.Create());
//Create new project
var project = ws.AddProject("Sample", "C#");
project = project.AddMetadataReference(mscorlib);
//Add project to workspace
ws.TryApplyChanges(project.Solution);
string text = @"
class C
{
    void M()
    {
        M();
        M();
    }
}";
var sourceText = SourceText.From(text);
//Create new document
var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
//Get the semantic model
var model = doc.GetSemanticModelAsync().Result;
//Get the syntax node for the first invocation to M()
var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol;
//Finds all references to M()
var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol,  doc.Project.Solution).Result;
var mscorlib=PortableExecutableReference.CreateFromAssembly(typeof(object.Assembly));
var ws=新的AdhocWorkspace();
//创建新的解决方案
var solId=SolutionId.CreateNewId();
var solutionInfo=solutionInfo.Create(solId,VersionStamp.Create());
//创建新项目
var project=ws.AddProject(“Sample”、“C#”);
project=project.AddMetadataReference(mscorlib);
//将项目添加到工作区
ws.TryApplyChanges(project.Solution);
字符串文本=@“
C类
{
void M()
{
M();
M();
}
}";
var sourceText=sourceText.From(text);
//创建新文档
var doc=ws.AddDocument(project.Id,“NewDoc”,sourceText);
//获取语义模型
var model=doc.GetSemanticModelAsync().Result;
//获取对M()的第一次调用的语法节点
var methodInvocation=doc.GetSyntaxRootAsync().Result.DegenantNodes().OfType().First();
var methodSymbol=model.GetSymbolInfo(methodInvocation.Symbol);
//查找对M()的所有引用
var referencesToM=SymbolFinder.FindReferencesAsync(methodSymbol,doc.Project.Solution);

您可能正在寻找类,特别是方法

听起来你很难熟悉罗斯林。我有一系列的博客帖子来帮助人们认识Roslyn

正如@SLaks提到的,您需要访问我在本文中介绍的语义模型

下面的示例向您展示了如何使用API。如果可以,我将使用
MSBuildWorkspace
从磁盘加载项目,而不是像这样在
AdHocWorkspace
中创建项目

var mscorlib = PortableExecutableReference.CreateFromAssembly(typeof(object).Assembly);
var ws = new AdhocWorkspace();
//Create new solution
var solId = SolutionId.CreateNewId();
var solutionInfo = SolutionInfo.Create(solId, VersionStamp.Create());
//Create new project
var project = ws.AddProject("Sample", "C#");
project = project.AddMetadataReference(mscorlib);
//Add project to workspace
ws.TryApplyChanges(project.Solution);
string text = @"
class C
{
    void M()
    {
        M();
        M();
    }
}";
var sourceText = SourceText.From(text);
//Create new document
var doc = ws.AddDocument(project.Id, "NewDoc", sourceText);
//Get the semantic model
var model = doc.GetSemanticModelAsync().Result;
//Get the syntax node for the first invocation to M()
var methodInvocation = doc.GetSyntaxRootAsync().Result.DescendantNodes().OfType<InvocationExpressionSyntax>().First();
var methodSymbol = model.GetSymbolInfo(methodInvocation).Symbol;
//Finds all references to M()
var referencesToM = SymbolFinder.FindReferencesAsync(methodSymbol,  doc.Project.Solution).Result;
var mscorlib=PortableExecutableReference.CreateFromAssembly(typeof(object.Assembly));
var ws=新的AdhocWorkspace();
//创建新的解决方案
var solId=SolutionId.CreateNewId();
var solutionInfo=solutionInfo.Create(solId,VersionStamp.Create());
//创建新项目
var project=ws.AddProject(“Sample”、“C#”);
project=project.AddMetadataReference(mscorlib);
//将项目添加到工作区
ws.TryApplyChanges(project.Solution);
字符串文本=@“
C类
{
void M()
{
M();
M();
}
}";
var sourceText=sourceText.From(text);
//创建新文档
var doc=ws.AddDocument(project.Id,“NewDoc”,sourceText);
//获取语义模型
var model=doc.GetSemanticModelAsync().Result;
//获取对M()的第一次调用的语法节点
var methodInvocation=doc.GetSyntaxRootAsync().Result.DegenantNodes().OfType().First();
var methodSymbol=model.GetSymbolInfo(methodInvocation.Symbol);
//查找对M()的所有引用
var referencesToM=SymbolFinder.FindReferencesAsync(methodSymbol,doc.Project.Solution);
一本关于问题和最终修复的杂志,我让Roslyn与VS2017合作: 当MSBuildWorkspace WorkspaceFailed事件挂接到中时,可以看到VS2017项目为空的原因

第一轮失败是:

MSB0001:内部MSBuild错误:Microsoft.Build.Utilities.ToolLocationHelper的类型信息在白名单缓存中显示为Microsoft.Build.Utilities.ToolLocationHelper,Microsoft.Build.Utilities.Core,版本=15.1.0.0,区域性=中性,PublicKeyToken=b03f5f7f11d50a3a,但无法加载该类型。意外为空])

通过安装NuGet软件包Microsoft.Build.Locator 1.1.2和Microsoft.Build.Utilities.Core 15.9.20解决了此问题

第二轮失败是:

Msbuild在处理文件“C:\Users…vbproj”时失败,消息为: C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets:(1491,5): 无法从程序集Microsoft.Build.Tasks.AssignProjectConfiguration加载“Microsoft.Build.Tasks.Core”任务,该程序集的版本为15.1.0.0,区域性为中性,PublicKeyToken=b03f5f7f11d50a3a。 无法加载文件或程序集“Microsoft.Build.Tasks.Core,版本=15.1.0.0,区域性=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。 系统找不到指定的文件。确认声明正确,程序集及其所有依赖项可用,并且任务包含实现Microsoft.Build.Framework.ITask的公共类。])

通过添加NuGet Microsoft.Build.Tasks.Core 15.9.20修复了此问题 第三轮失败是: ==Msbuild在处理文件“C:\Users…vbproj”时失败,消息为: C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets:(1657,5): 无法从程序集实例化“GetReferenceNearestTargetFrameworkTask”任务 “C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\NuGet\NuGet.Build.Tasks.dll”。 请验证任务程序集是使用与计算机上安装的Microsoft.Build.Framework程序集版本相同的版本生成的 并且您的主机应用程序没有丢失绑定重拨