Tag: roslyn

新的C#6对象初始化程序语法?

我刚刚注意到在Visual Studio 2015中编写的C#中可以使用以下内容,但我以前从未见过它: public class X { public int A { get; set; } public YB { get; set; } } public class Y { public int C {get; set; } } public void Foo() { var x = new X { A = 1, B = { C = 3 } }; } 我的期望是Foo必须像这样实现: […]

带有intellisense的内置C#/ VB.Net编辑器 – Roslyn,VSTA还是其他什么?

我需要在我的应用程序中提供脚本function,允许客户使用我们的对象模型扩展其function。 我希望提供一些带有intellisense的集成C#/ VB.Net编辑器,但在查看AvalonEdit和ScintillaNet等产品之后,它们似乎没有提供真正的代码完成,只是一个API,您可以在其中提供自己的列表弹出自动完成列表中显示的项目。 因此,我想知道罗斯琳是否提供了这样的function? 从我遇到的教程和示例中可以看出,Roslyn实际上只是一个编译器服务。 作为最后的手段,客户可以使用像VS Express这样的东西,但集成的编辑器显然更好一些。 (我也遇到了Visual Studio Tools for Applications,听起来很有希望;但是在线资源已有几年历史了,文档/教程也不存在,所以我用这个来填空。)

Roslyn SDK预览中的代码格式

在早期版本(Roslyn CTP)中,我使用以下代码来格式化我生成的代码,它工作得很好: SyntaxNode.Format(FormattingOptions.GetDefaultOptions()).GetFormattedRoot() 使用新的Roslyn版本它不再适用,那么新版本(SDK预览版)中上述代码的等价物是什么?

如果新的c#6“?”null检查,则调用而不是callvirt

鉴于这两种方法: static void M1(Person p) { if (p != null) { var p1 = p.Name; } } static void M2(Person p) { var p1 = p?.Name; } 为什么M1 IL代码使用callvirt : IL_0007: brfalse.s IL_0012 IL_0009: nop IL_000a: ldarg.0 IL_000b: callvirt instance string ConsoleApplication4.Person::get_Name() 和M2 IL使用call : brtrue.s IL_0007 IL_0004: ldnull IL_0005: br.s IL_000d IL_0007: ldarg.0 IL_0008: […]

在Roslyn分析器中检查表达式类型的正确方法?

我正在用Roslyn编写代码分析器,我需要检查ExpressionSyntax是否为Task或Task 。 到目前为止我有这个: private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context) { var type = context.SemanticModel.GetTypeInfo(expression).Type; if (type == null) return false; if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName(“System.Threading.Tasks.Task”))) return true; if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName(“System.Threading.Tasks.Task`1”))) return true; return false; } 它适用于Task ,但不适用于Task或Task …我可以检查名称和命名空间,但这是不切实际的,因为我必须检查命名空间的每个“级别”。 有推荐的方法吗?

如何编译C#字符串插值?

我知道插值是string.Format()语法糖,但是当它与字符串格式化方法一起使用时,它是否有任何特殊的行为/识别? 如果我有一个方法: void Print(string format, params object[] parameters) 以下使用插值调用它: Print($”{foo} {bar}”); 以下哪个调用行最相当于字符串插值的编译结果? Print(string.Format(“{0} {1}”, new[] { foo, bar })); Print(“{0} {1}”, new[] { foo, bar }); 问题背后的推理:NLog等日志框架通常会延迟字符串格式化,直到确定实际写入日志消息为止。 一般来说,我更喜欢字符串插值语法,但我需要知道它是否会产生额外的性能损失。

从Roslyn ClassDeclarationSyntax获取类FullName(包括命名空间)

我在roslyn的语法树中有一个ClassDeclarationSyntax。 我这样看了: var tree = SyntaxTree.ParseText(sourceCode); var root = (CompilationUnitSyntax)tree.GetRoot(); var classes = root.DescendantNodes().OfType(); 标识符仅包含类的名称,但不包含有关命名空间的信息,因此缺少fullType名称。 像“MyClass”但是noch“Namespace1.MyClass” 获取语​​法的名称空间/ FulltypeName的推荐方法是什么?

如何从调用方法的InvocationExpressionSyntax节点获取IMethodSymbol或方法声明的语法节点?

在我的分析器的实现中,我在AnalyzeSymbol方法中: public override void Initialize(AnalysisContext context) { context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.Method); } private static void AnalyzeSymbol(SymbolAnalysisContext context) { // here I look through the syntax of the method body in order to find invocations. var methodSymbol = context.Symbol as IMethodSymbol; var location = methodSymbol.Locations.FirstOrDefault(); var methodNode = location.SourceTree.GetCompilationUnitRoot().FindNode(locati‌​on.SourceSpan); var blockNode = methodNode.ChildNodes().FirstOrDefault(s => s is BlockSyntax); var […]

使用Roslyn查找特定方法的所有方法调用

我正在使用Roslyn编写代码分析器,我当前的任务是找到程序集中未使用的所有内部方法。 我从MethodDeclarationSyntax开始并从中获取符号。 然后我在FindCallersAsync中使用FindCallersAsync方法,但它返回一个空集合,即使我在程序集中的某个地方调用有问题的方法时也是如此。 请参阅下面的代码。 protected override void Analyze(SyntaxNodeAnalysisContext context) { NodeToAnalyze = context.Node; var methodDeclaration = NodeToAnalyze as MethodDeclarationSyntax; if (methodDeclaration == null) return; var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration) as ISymbol; if (methodSymbol.DeclaredAccessibility != Accessibility.Internal) return; var solutionPath = GetSolutionPath(); var msWorkspace = MSBuildWorkspace.Create(); var solution = msWorkspace.OpenSolutionAsync(solutionPath).Result; var callers = SymbolFinder.FindCallersAsync(symbol, solution).Result; // Returns empty […]

从Roslyn中的行号获取节点

如何根据行号获取SyntaxNode ? 否则,如果它可以获得该行号的LineSpan然后到节点。