Tag: roslyn

使用Roslyn,如何检查类是来自本地项目,而不是BCL或Nuget(等)?

我想写一个Roslyn代码分析器; 如果ObjectCreationExpression正在从本地类(在当前项目或当前解决方案中的项目中)创建对象,则需要解决这个问题; 或者如果该类来自其他地方,如基类库或Nuget包等。 我如何判断Roslyn的课程来自哪里?

如何使用Roslyn代码修复提供程序API从Document中删除SyntaxNode列表?

我正在使用SyntaxFactory.VariableDeclaration定制生成的变量声明,并根据某些条件收集了一个SyntaxNode列表。 我做了以下事情: 修改节点 var newRoot = root.ReplaceNode(expression, newVariableDeclaration) 这使用newVariableDeclaration成功修改了节点。 在循环中,删除与列表中存在的节点对应的节点 foreach (var listObject in listObjects) { newRoot = newRoot.RemoveNode(listObject, SyntaxRemoveOptions.KeepNoTrivia); } 这不会更改listObject需要更改的所有listObject保持不变。 如果我们使用root.RemoveNode(listObject, SyntaxRemoveOptions.KeepNoTrivia)它显然将继续替换先前的更改。 所以这里newVariableDeclaration是整个文档中唯一被更改的节点,这是因为SyntaxNodes SyntaxNode与我从root获取的SyntaxNode更改。 如果我做错了,请纠正我。 编辑:我查看了CSharpSyntaxRewriter但似乎它每次访问节点时都在分析单个节点,并且一次只能修改一个节点。 在我的场景中,我将不得不访问特定节点,对其进行更改,并删除与访问节点所做更改相关的其他节点。

使用intellisense支持从文件动态生成枚举

我听说过很多关于Roslyn的内容,我只是认为可以从xml文件中动态生成代码,这样对于开发人员来说它是透明的,他可以使用IntelliSense枚举代码,就好像代码是在项目中编写的一样。 我正在编写一个框架,通过配置文件进行了大量的自定义,如果可能的话,我真的很想使用这样的function。

使用Roslyn编译xaml

简短的故事:有没有办法使用Roslyn编译器来编译WPF UserControl? 假设你想要编译一个包含标准C#代码和WPF控件(XAML和xaml.cs文件)的程序集,当然没有任何csproj。 我在网上发现了很多关于如何使用Roslyn编译DLL的内容,没有关于如何处理XAML文件的内容? 我知道Visual Studio(或MSBuild)会创建一个临时生成的文件,并在生成的程序集中嵌入一个BAML文件。 所以,如果我能找到一种生成这个中间文件的方法,我可以使用它,但我发现的只是PresentationBuildTasks.MarkupCompilePass,最终需要一个csproj(好吧,我可能会动态生成一个项目,但我希望找到更简单的东西)。 谢谢你的帮助。

C#Roslyn更改了评论类型

我正在尝试为Visual Studio做一个扩展,它改变了代码中的一些语法。 实际上,我已经完成了第一步,即改变变量的名称,如果这个名称不是我们在公司使用的规则。 例如: int newVariable; double test; 将改为: int iNewVariable; double dblTest; 现在我必须更改此类评论:(SingleLineComment) //this is a single line Comment 进入MultiLineComment /*Here it’s a MultiLine one*/ 我使用Roslyn语法Visualiser来查找生成正确代码的类型和种类,但没有任何作用。 这就是我为Diagnostic做的事情: using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Diagnostics; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace CodeFix { [DiagnosticAnalyzer] [ExportDiagnosticAnalyzer(DiagnosticId, LanguageNames.CSharp)] public class DiagnosticAnalyzer […]

使用msbuildworkspace打开解决方案会在没有详细信息的情况下发出诊断错

我正在尝试使用MSBuildWorkspace分析Roslyn的解决方案。 该解决方案是一种新的解决方案,其中包含2个类库项目,一个引用另一个。 它们是在Visual Studio 2017中创建的.Net 4.6.2。 当我打开解决方案时,我在workspace.Diagnostics中收到两个通用错误,两者都是:处理文件’ PathToProject时Msbuild失败’在诊断或输出窗口中没有更多内容,表明它为什么处理项目文件失败。 打开解决方案的代码: namespace RoslynAnalyse { class Program { static void Main(string[] args) { LocalAnalysis(); } private static void LocalAnalysis() { var workspace = MSBuildWorkspace.Create(); var solution = workspace.OpenSolutionAsync(@”D:\Code\Roslyn\RoslynAnalyse\SolutionToAnalyse\SolutionToAnalyse.sln”).Result; var workspaceDiagnostics = workspace.Diagnostics; } } } Microsoft.CodeAnalysis的版本是2.0.0.0。 有没有人知道为什么MSBuild失败了,我怎么能获得更多信息?

如何检测和纠正无用的try catch块?

我已经开始使用.Net Complier Platform(Roslyn)来协助执行编码标准。 我正在努力解决的一个问题是发现并捕捉无用的try…catch块。 例如: // Would like to have this detected and offer to remove the try…catch try { // Do some work } catch(Exception ex) { throw ex; } 最好还能检测到代码使用throw ex;的事实throw ex; 而不仅仅是throw; 如: try { // So some work } catch(Exception ex) { // Log the error or anything to manage the […]

使用新的csproj在PDB中嵌入C#源代码

最近发布的.NET工具似乎支持在PDB中嵌入C# ,这应该可以改善步入第三方等的体验。运行csc /? ,我可以清楚地看到/ embed选项:“将所有源文件嵌入到PDB中。” 但是,似乎没有任何方法可以在csproj中指定它。 更重要的是,似乎没有任何规定将任意开关传递给编译器,我将用它来手动传递/嵌入。 任何人都可以确认我没有错过任何内容,并且目前缺乏对/ embed的构建支持吗? 这是否存在问题(如果没有问题)? 任何建议的解决方法也将不胜感激。

从分类器VSIX获取语义模型

由于R#不支持Roslyn Early Preview C#6.0function,代码看起来非常沉闷…… 我想使用分类器VSIX对代码着色。 是否可以从Roslyn语言服务获取当前文档的语义模型?

如何使用Roslyn获取方法定义?

如何从MemberDeclarationSyntax对象单独获取方法声明? 如何用空的方法定义替换单行和多行注释。 我们可以用SyntaxTriviaList做到这一点。 这里我没有为SyntaxTriviaList分配任何对象。 我们有什么方法吗? 从身体的定义获得琐事信息。 如何单独获取方法名称。 private string GetMethodsInSourceFile(string fileName) { SyntaxTree tree = SyntaxTree.ParseFile(fileName); var root = (CompilationUnitSyntax)tree.GetRoot(); IEnumerable syntaxNodes; syntaxNodes = from methodDeclaration in root.DescendantNodes() .Where(x => x is MethodDeclarationSyntax || x is PropertyDeclarationSyntax) select methodDeclaration; if (syntaxNodes != null && syntaxNodes.Count() > 0) { foreach (MemberDeclarationSyntax method in syntaxNodes) { if […]