Tag: roslyn

在解决方案中检索Roslyn的所有类型

有谁知道如何在解决方案中检索所有可用类型(语义)? 从几个项目中创建汇编很容易。 MSBuildWorkspace workspace = MSBuildWorkspace.Create(); var solution = await workspace.OpenSolutionAsync(solutionPath, cancellationToken); var compilations = await Task.WhenAll(solution.Projects.Select(x => x.GetCompilationAsync(cancellationToken))); 迭代所有ClassDeclarations对我来说是不够的,因为我想要所有类型和它们之间的连接。 foreach (var tree in compilation.SyntaxTrees) { var source = tree.GetRoot(cancellationToken).DescendantNodes(); var classDeclarations = source.OfType(); }

ISymbol.DeclaringSyntaxReferences和ISymbol.Locations之间的区别

ISyntax接口中的DeclaringSyntaxReferences属性和Locations属性之间有什么区别?

WPF / XAML:如何引用未在任何命名空间中定义的类

我正在执行一个尝试定义和打开WPF窗口的roslyn脚本。 除此之外,我的脚本 定义附加行为 定义一个XAML字符串,基于此我创建一个WPF窗口。 在这个XAML代码中,我想使用我的脚本中定义的TextBoxCursorPositionBehavior。 我的脚本(.csx)文件看起来类似于 public class TextBoxCursorPositionBehavior : DependencyObject { // see http://stackoverflow.com/questions/28233878/how-to-bind-to-caretindex-aka-curser-position-of-an-textbox } public class MyGui { public void Show() { string xaml = File.ReadAllText(@”GUI_Definition.xaml”); using (var sr = ToStream(xaml)) { System.Windows.Markup.ParserContext parserContext = new System.Windows.Markup.ParserContext(); parserContext.XmlnsDictionary.Add( “”, “http://schemas.microsoft.com/winfx/2006/xaml/presentation” ); parserContext.XmlnsDictionary.Add( “x”, “http://schemas.microsoft.com/winfx/2006/xaml” ); parserContext.XmlnsDictionary.Add(“i”,”clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity”); // ?? How can i define this […]

CodeDomProvider.CompileAssemblyFromSource – 找不到Roslyn(csc.exe)

我们最近从旧的CodeDomProvider升级到名为Microsoft.CodeDom.Providers.DotNetCompilerPlatform的新Roslyn CodeDomProvider。 它工作正常,但它在错误的地方寻找csc.exe。 NuGet包将exe放在路径中: [App Path] \ bin \ Debug \ roslyn 但是,当我们编译时,我们得到这个错误: 无法找到路径'[App Path] \ bin \ Debug \ bin \ roslyn \ csc.exe’的一部分。 请注意,它正在寻找错误位置的exe。 它正在bin \ Debug文件夹中的“bin”文件夹中查找它。 因此,为了使我们的代码编译,我们需要将Roslyn编译器移动到:[App Path] \ bin \ Debug \ bin \ roslyn \ csc.exe 有没有办法告诉CodeDomProvider Roslyn编译器所在的位置? 这不仅仅是Roslyn编译器代码中的一个直接错误吗?

如何使用Roslyn代码诊断识别和分析局部变量和参数?

我很困惑在AnalysisContext context对象上使用哪种方法来使每个函数/方法的局部变量都是anazlyed: RegisterSymbolAction()或RegisterSyntaxNodeAction() 。 根据Roslyn SDK Project Templates.vsix中的示例Diagnostic with Code Fix(NuGet + VSIX),它可能是RegisterSymbolAction() 。 我正在调试使用一个简单的控制台应用程序,其Main()有一些string和int类型的局部变量。 我已经尝试过这两个,但是它们都不会触发任何变量在各自的AnalyzeSymbol()回调方法中进行分析。 每个回调方法中的断点都不会受到局部变量的影响。 如何在回调方法AnalyzeSymbol()分析局部变量和/或我做错了什么? var symbolsToActOn = new[] { SymbolKind.Local, SymbolKind.Parameter, SymbolKind.Field }; context.RegisterSymbolAction(AnalyzeSymbol, symbolsToActOn); 要么 var syntaxTypes = new[] { SyntaxKind.IdentifierName, SyntaxKind.IdentifierToken, SyntaxKind.Parameter }; context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, syntaxTypes); 我的演示项目在GitHub上进行了仔细研究,具体部分在DiagnosticAnalyzer.cs中 。

删除块的内容

我正在编写一个带有Code Fix的Roslyn诊断程序。 如果有一个带有一个空catch块的try块,我想提供一个选项来删除catch块并用其内容替换try块。 我的问题是try块内容的外观。 我尝试使用Formatter,但这些行仍然过多地存在于一个级别。 这是我的代码: private async Task RemoveTryCatchBlockAsync(Document document, TryStatementSyntax tryBlock, CancellationToken cancellationToken) { var oldRoot = await document.GetSyntaxRootAsync(cancellationToken); var newRoot = oldRoot.ReplaceNode(tryBlock, tryBlock.Block.ChildNodes()); Formatter.Format(newRoot, MSBuildWorkspace.Create()); // Return document with transformed tree. return document.WithSyntaxRoot(newRoot); }

为什么VS 2017建议用方法替换属性?

我注意到Visual Studio 2017中的每个属性都有一个快速操作,建议用方法替换它。 这是否意味着属性不是设置和获取字段值的推荐方法,Microsoft是否打算在将来弃用它?! 或者为此目的使用属性方法可以获得任何收益吗?

为什么为匿名类生成的GetHashCode()实现中的初始哈希值取决于属性名称?

在为匿名类生成GetHashCode()实现时,Roslyn根据属性名称计算初始哈希值。 例如,为其生成的类 var x = new { Int = 42, Text = “42” }; 将有以下GetHashCode()方法: public override in GetHashCode() { int hash = 339055328; hash = hash * -1521134295 + EqualityComparer.Default.GetHashCode( Int ); hash = hash * -1521134295 + EqualityComparer.Default.GetHashCode( Text ); return hash; } 但是,如果我们更改属性名称,则初始值会更改: var x = new { Int2 = 42, Text2 […]

如何用Roslyn中的var替换字符串变量?

对于本地声明,例如:string a = string.Empty; 如何编写诊断程序将其更改为:var a = string.Empty;

用roslyn扩展c#语法

我正在尝试在没有else的情况下实现“return if”/“return value if”,因为我只想在条件有效时返回或返回值。 我知道,有if (condition) return; 或者if (condition) return value; 但是我希望代码更清晰一点,因为它更具可读性,所以拥有这种语法会很好。 我听说过roslyn这是可能的,并在这里回答问题: 有没有办法在C#中实现自定义语言function? 但我不知道如何实现它。 所以代码将是这样的: public class Testclass { public static void Main(String[] args) { Testclass t = new Testclass(); t.TestMyClassWithVoid(); bool success = t.TestMyClassWithInt(3) == 3; bool fail = t.TestMyClassWithInt(2) == 2; } public void TestMyClassWithVoid() { int value = GetValueFromSomeWhere(); return if […]