Tag: roslyn

获取ReferenceLocation的符号

我正在使用SymbolFinder在我的解决方案中找到对某种类型的所有引用,如下所示: ISymbol typeOfInterest = compilation.GetTypeByMetadataName( “System.Reflection.PropertyInfo”); var references = SymbolFinder.FindReferencesAsync(typeOfInterest, solution).Result; foreach (var reference in references) { // reference.Locations => symbol? } 这部分工作正常, SymbolFinder返回正确的ReferenceLocations (手动检查时)。 我实际上对这些位置的符号感兴趣,以获得有关引用的更多(语义)信息,因此我可以过滤/使用它(例如,只处理属性)。 关于Roslyn的公共信息似乎很少,我在SDK预览的示例中找不到任何符合SymbolFinder结果的SymbolFinder 。 所以这是我的问题:是否有可能获得对应于ReferenceLocation的符号? 怎么样?

Roslyn,通过hostObject传递值

我试图通过hostObject发送一个类,但显然它不想工作: using Roslyn.Compilers; using Roslyn.Compilers.CSharp; using Roslyn.Scripting; using Roslyn.Scripting.CSharp; public class ShippingService { public class ShippingDetails//class that I want to send { public decimal total { get; set; } public int quantity { get; set; } public string destination { get; set; } } public static string ShipingCost(decimal total, int quantity, string destination) { var […]

Roslyn:将C#转换为VB

我有一个案例,我需要将C#转换为VB.NET项目。 (我想自动化这个,所以我不能使用在线工具或类似的东西) 有一个“粘贴为C#/ VB”样本视觉工作室扩展 ,似乎能够做到这一点。 我试过转换这个类: namespace TestApplication { class Class1 { /// /// Lorem /// public void Lorem() { } } } 但它最终得到了这个: Namespace TestApplication Class Class1 ”’ Lorem Public Sub Lorem() End Sub End Class End Namespace 它不仅发生在提供XML文档注释时,而且有时在inheritance其他类时也会发生。 这是处理样本转换的代码: csharpToVisualBasicConverter.Convert返回一个SyntaxNode实例。 private void PasteAsVB() { var csharpCode = Clipboard.GetText(TextDataFormat.Text); var tree = CS.SyntaxTree.ParseText(csharpCode); var […]

罗斯林启动时间慢

我注意到Roslyn解析/编译的启动时间是一个相当重要的一次性成本。 编辑:我正在使用Roslyn CTP MSI(程序集在GAC中)。 这是预期的吗? 有没有解决方法? 运行下面的代码与1次迭代(约3秒)和300次迭代(约3秒)的时间几乎相同。 [Test] public void Test() { var iters = 300; foreach (var i in Enumerable.Range(0, iters)) { // Parse the source file using Roslyn SyntaxTree syntaxTree = SyntaxTree.ParseText(@”public class Foo” + i + @” { public void Exec() { } }”); // Add all the references we need for […]

无法在Roslyn的新nuget中获取方法SyntaxTree.ParseFile?

我已经使用Install-Package Microsoft.CodeAnalysis -Pre安装了针对Roslyn nuget.CodeAnalysis -Pre但我仍然无法获取方法SyntaxTree.ParseFile因为我想在.cs文件中传递代码 任何关于为什么会这样的线索? 我怎么能在这里传递文件?

可以使用Roslyn生成类似于DynamicMethod IL生成的动态方法

我一直在使用DynamiMethod来生成IL method.GetILGenerator(); 这很好用,但当然很难使用,因为你通常不想在C#这样的高级语言中使用低级别的IL。 现在,因为有罗斯林,我可以使用它。 我试图找出如何使用Roslyn做类似的事情:生成一个动态方法,然后为它创建一个委托。 我能做到的唯一方法是拥有这样的全class SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(@” using System; namespace RoslynCompileSample { public class Writer { public void Write(string message) { Console.WriteLine(message); } } }”); 然后我可以使用字符串连接插入我的方法而不是Write方法。 之后,在内存中生成动态程序集并加载,并使用reflection来获取所需的方法并生成委托。 这种方法似乎工作正常但对我的情况似乎有点过分,因为我需要使用多个独立的方法,导致大量的程序集被加载。 所以问题是:是否有一种简单的方法可以为Roslyn执行类似于动态方法的操作,这样我只能定义附加到类型的方法体? 如果没有,编译许多动态程序集有什么大的缺点(比如太多无法加载等等)

在SyntaxTree中获取给定linenumber的SyntaxNode

我想得到给定位置(lineNumber)的一行的SyntaxNode。 下面的代码应该是不言自明的,但让我知道任何问题。 static void Main() { string codeSnippet = @”using System; class Program { static void Main(string[] args) { Console.WriteLine(“”Hello, World!””); } }”; SyntaxTree tree = SyntaxTree.ParseCompilationUnit(codeSnippet); string[] lines = codeSnippet.Split(‘\n’); SyntaxNode node = GetNode(tree, 6); //How?? } static SyntaxNode GetNode(SyntaxTree tree,int lineNumber) { throw new NotImplementedException(); // *** What I did *** //Calculted length […]

了解C#中运行时代码生成的各种选项(Roslyn,CodeDom,Linq Expressions,…?)

我正在开发一个应用程序,我想动态生成用于数值计算的代码(用于性能)。 将此计算作为数据驱动操作太慢。 要描述我的要求,请考虑以下类: class Simulation { Dictionary nodes; double t, dt; private void ProcessOneSample() { t += dt; // Expensive operation that computes the state of nodes at the current t. } public void Process(int N, IDictionary Input, IDictionary Output) { for (int i = 0; i < N; ++i) { foreach (KeyValuePair j in […]

Roslyn脚本:运行时exception的行号信息

我正在搞乱使用Roslyn脚本编写的东西(使用Microsoft.CodeAnalysis.CSharp.Scripting nuget包),我想知道是否有办法在脚本中发生exception的堆栈跟踪中添加行号信息。 当我运行以下C#代码时: // using Microsoft.CodeAnalysis.CSharp.Scripting; var code = @” var a = 0; var b = 1 / a; “; try { await CSharpScript.RunAsync(code); } catch (DivideByZeroException dbze) { Console.WriteLine(dbze.StackTrace); } 写入控制台的堆栈跟踪是: at Submission#0.<>d__0.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at […]

什么是新的.Net Native

今天我读了一篇关于MSDN上新的.Net Native的文章。 “使用.NET Native,Windows Store应用程序的启动速度提高了60%,并且内存占用空间更小。我们的第一个版本是开发人员预览版,允许您使用这个新编译器开发和测试应用程序。此.NET预览版提供你用C#的生产力来表现C ++“。 当然,这真的很有趣但是如果.Net Native是一个新的编译器,它提供了良好的性能,那么为什么我们需要去RyuJIT。 什么是这个新的.Net Native? 新的.Net Native和RyuJIT之间的区别是什么,微软发布的编译器也称为Roslyn。 那么Roslyn如何支持这个新的.Net Native。