问题标签 [roslyn]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Roslyn 对 SyntaxTree 构建的质疑
免责声明
我很确定我遗漏了一些明显的东西,但是即使在阅读了官方文档之后,我也不清楚 Roslyn 如何创建语法树。
例子
考虑以下简单的代码:
我得到了SyntaxTree
这个代码并做了这样的事情,非常粗略和简单,但我只需要理解。
而且效果很好。
麻烦
但是,在方法中添加注释就足够了 ReadFromUsb()
,就像这样
并ChildNodes()
在 {1} 标记的行上调用,因为CLASS (???) 返回 0。
问题
为什么向成员函数添加注释,重置父 CLASS 子语法节点的集合?
我错过了什么?
c# - C# 中“假”linq 理解语法关键字的可用选项?
虽然在少数情况下我会使用方法链编写一些东西(特别是如果它只有一两个方法,比如 foo.Where(..).ToArray()),但在许多情况下,我更喜欢 LINQ 查询理解语法而是(规范中的“查询表达式”),例如:
在其中一些相当大的块中,我需要获取生成的 IEnumerable 并将其急切加载到数据结构(数组、列表等)中。这通常意味着:
添加另一个局部变量,例如 var queryResult = query.ToArray(); 或者
用括号包装查询并在 ToArray (或 ToList 或其他)上标记。
我试图找出其他人正在使用的选项 1) 已经在使用或 2) 可以认为添加一些额外的“上下文关键字”是可行的——只是可以像现有方法一样转换为扩展方法的东西,好像 LINQ 关键字是“本机”可扩展的 :)
我意识到这很可能意味着某种预处理(不确定 C# 在这个领域中有什么)或将编译器更改为Nemerle之类的东西(我认为这是一个选项,但不太确定? )。我还不太了解 Roslyn 所做/将支持什么,所以如果有人知道它是否可以允许某人像这样“扩展”C#,请插话!
我可能会使用最多的那些(虽然我确信还有很多其他的,但只是为了理解这个想法/我希望的是什么):
ascount - 转换为 Count()
这将“转换”(无论路径是什么,只要最终结果是)为:
相似地:
- asarray - 转换为 ToArray()
- aslist - 转换为 ToList()
(您显然可以继续使用 First()、Single()、Any() 等,但要控制问题范围 :)
我只对不需要传递参数的扩展方法感兴趣。我不想尝试用(例如)ToDictionary 或 ToLookup 来做这种事情。:)
所以,总结一下:
- 想要将“ascount”、“aslist”和“asarray”添加到 linq 查询表达式中
- 不知道这是否已经解决
- 不知道 Nemerle 是否是一个不错的选择
- 不知道 Roslyn 的故事是否会支持这种用法
roslyn - 使用 Roslyn - 编译器即服务有什么好处
关于 Roslyn 项目,什么是 CaaS(编译器即服务)?
与当前的 C# 4.0 编译器相比,使用 Roslyn 功能如何提高 C# 应用程序的性能?
Roslyn-CTP 中的已知限制/问题是什么?
ef-code-first - 使用 Roslyn 创建 EF CodeFirst DbContext
只是我正在玩的一个小想法,不确定它是否可行或有多大用处。
我正在尝试使用 Roslyn CTP 生成一个非常基本的 EF Code First 数据库。
代码:
执行时出现以下异常
例外:
未映射类型“Submission#0+Car”。使用 Ignore 方法或 NotMappedAttribute 数据注释检查该类型是否被显式排除。验证该类型是否被定义为一个类,不是原始的、嵌套的或泛型的,并且不是从 EntityObject 继承的。
查看可能的问题列表,我猜 Roslyn 正在将嵌套类作为代码生成的一部分。这是有道理的,否则“new Context();” call 需要被包装到某种类/方法中。我可以发出一个程序集,它可以确认上述内容,但可能没有任何关于如何正确编写它的线索。
我也走上了 Syntax.ClassDeclaration 的路线,但最后只用了几百行代码来创建一个具有 1 个属性的类,并且没有明显的方法来实例化该类。
问题
有没有一种简单的方法可以在 Roslyn 中创建一个可公开访问的类(例如,不嵌套在另一个类中)?
c# - 将 .exe 打包到 .vsix 并从 Visual Studio 扩展调用
我有一个 Visual Studio 包,它通过启动一个外部进程(使用System.Diagnostics.Process
)并通过标准输入/输出与其通信来完成它的一些工作。目前,我有.exe
硬编码的路径,这显然不适用于实际部署扩展。使用扩展打包和分发的正确方法是什么.exe
?(并且,相关的,一旦我这样做了,我如何以编程方式发现已安装.exe
文件的路径。)最好我想将它放入.vsix
文件中,以便安装。
编辑:我已将我的代码的相关部分放在 BitBucket 上(它可能对使用 Roslyn 的其他人有用):roslyn_process以便更好地了解我正在尝试做什么。此代码AbstractProcessHandler
使用RoslynProcess
. 后者会随时了解对 Visual Studio 中代码文件的修改以及正在查看哪个代码文件,因此它能够使用最新信息进行分析,尽管它不是作为 Visual Studio 扩展运行的,这会施加以下限制Roslyn 关于正在编辑的所有代码。
编辑 2:使用这个答案,我可以获得扩展的目录。source.extension.vsixmanifest
我可以通过将其作为“自定义扩展类型”类型添加到内容列表中来包含另一个包。然后.exe
出现在扩展的目录中。这似乎是正确的解决方案,尽管获取目录的方式在 MSDN 中被标记为我不应该使用的东西。
看起来这可能是最好的方法,即使它看起来很hackish,在这种情况下,一旦我一切正常,我会发布这个作为答案。
c# - 使用 Roslyn 向 C# 类添加自定义属性
考虑文件“MyClass.cs”中的以下类
目前我手动创建数据契约类,如下所示:
我想用 Roslyn 重写“MyClass.cs”,让它看起来像我手工创建的类。目前我有以下内容:
我一直在尝试找到一种将 DataMember 和 DataContract 自定义属性添加到 MyClass 的方法,但没有成功。如何添加自定义属性?
c# - 查找方法的声明类型
给定一个 MethodDeclarationSyntax 对象,我如何找出该方法的声明类型?
我的实际问题是我需要弄清楚引用的方法是否正在实现接口方法。
例如,给定下面的代码,如果我有Dispose()方法的 MethodDeclarationSyntax,如何断定它是 IDisposable.Dispose() 的实现?
我试图获取方法的声明类型(并检查类型)但没有成功(父属性给我返回 InterfaceImplementation 类)。
我还尝试获取该方法的语义符号:
但找不到任何可以帮助我的东西。
想法?
visual-studio - 如何使 Roslyn Syntax Visualizer Extension 工作?
安装 Roslyn 后,它附带了几个很棒的演示工具。首先,对于那些想要更彻底地学习语法树的人来说,我认为最有价值的是语法可视化工具窗口,它显示了活动 *.cs 文件的语法树。
当我启动此扩展并在 Visual Studio 的测试实例中进行尝试时,一切正常。但是当我安装了这个扩展后,它就不再工作了。我仍然有 View -> Other Windows -> Roslyn Syntax Visualizer 但只是弹出一个空窗口工具。
有没有人有同样的问题并知道解决方案?
我想也许我需要复制这个扩展在重建时产生的 DLL 文件,但我不知道我应该把它放在哪里。
后来我发现了另一个有趣的细节——当我启动我自己的扩展时,语法可视化工具就可以工作了!因此,它仅适用于 Visual Studio 的测试实例。为什么会这样?
roslyn - roslyn 可以提供哪些代码优化
我已经开始使用 Roslyn 的语法和语义 API。还没有真正深入研究,但是语义 API 是否提供了任何代码优化,例如:
死代码消除、提升或某种指针分析?或其他分析?
我知道 roslyn 为 DFA 和 CFA 提供了方法,但是有什么可以作为奖励的吗?
c# - 将 LINQ 查询转换为字符串,发送到远程服务器以使用 Roslyn 解析为表达式?
我有一个数据源,例如IDataSource : IEnumerable<IDynamicObject>
一种实现是查询纯 XML 数据,另一种实现是查询 SQL 数据库。
我的数据源没有具体的类型,并且仅适用于简单的模式类型。
在某些情况下,这些数据源在相同的运行时上下文中实例化,而其他它们通过网络访问。
我无法使用 LINQ 查询我的数据源,我计划使用动态对象仅提取和解析作为实际查询一部分的成员值。
这在相同的运行时上下文中运行时效果很好,但是当数据源位于远程服务器上的 Web 服务后面时,这会失败,因为我无法以我所知道的任何方式将 LINQ 与 Web 服务一起使用。
所以我一直在寻找一种将我的 LINQ 查询格式化为字符串并将其发送到服务器的方法,然后将其解析回一个表达式并在新的上下文中执行它。
我能找到的两种解析表达式的方法是Dynamic LINQ和FLEE。我只是简单地看了它们,但似乎没有一个能够将表达式格式化为字符串并对其进行解析?
我已经阅读了有关 Roslyn 项目的信息,并在想也许它可以用来解决这个问题?有人知道更多吗?
我也看过一些,IQueryable<TData>
但我读过很多关于它的负面消息,所以也许我应该避免它。此外,它是强类型的,不符合我的需求,因为我不希望数据服务器上有任何具体类型。我也看不到如何通过网络服务使用强类型?我错过了什么吗?