Questions tagged «roslyn»

Roslyn(又名.NET编译器平台)为开源C#和Visual Basic编译器提供了丰富的代码分析API。它支持使用Visual Studio使用的相同API来构建代码分析工具。

30
找不到路径的一部分... bin \ roslyn \ csc.exe
我正在尝试运行从TFS源代码控制检索的Asp.net MVC项目。我已经添加了所有程序集引用,并且能够成功构建和编译而没有任何错误或警告。 但是我在浏览器中收到以下错误: 找不到路径“ C:\ B8akWorkspace \ B8akProject \ B8akSolution \ B8AK.Portal \ bin \ roslyn \ csc.exe”的一部分。 这是错误页面的完整屏幕截图。 经过几天的研究,我了解到Roslyn是.Net编译器平台,可提供高级编译功能。但是,我不明白为什么我的版本试图查找\ bin \ roslyn \ csc.exe,因为我没有配置与Roslyn相关的任何内容,也不打算在项目中使用Roslyn。
811 c#  asp.net  .net  asp.net-mvc  roslyn 

5
C#交互式窗口可以与我的代码进行交互吗?
在Visual Studio 2015或更高版本中,我可以打开“ C#交互式窗口”,然后运行代码: > 5 + 3 8 那很可爱。现在我该如何交互我的代码(我的类)?假设我有一个开放的项目。 > new Cog() (1,5): error CS0246: The type or namespace name 'Cog' could not be found (are you missing a using directive or an assembly reference?)
161 c#  .net  visual-studio  roslyn 

3
C#编译器使用哪种语言编写?
我在http://referencesource.microsoft.com/上查看了源代码,似乎所有源代码都在C#中。 我还查看了新的C#编译器平台(Roslyn)的源代码,它也在C#中。那怎么可能?C#语言编译器是用C#编写的吗?还是我缺少明显的东西?如果C#编译器是用C#编写的,那么它如何工作?

5
VS2015构建失败,并且没有带有Dynamic的错误消息
我正在对返回JSON的代码编写单元测试。它返回的类型是一个匿名类型,所以我认为要验证它的值,我只是将对象转换为a dynamic来进行断言。 但是,当我这样做时,我的构建失败了,但是没有任何错误消息。我能够用一个非常简单的代码在一个新的单元测试项目中重现它: [TestMethod] public void TestMethod1() { var obj = new { someValue = true }; dynamic asDynamic = obj; Assert.IsTrue(asDynamic.someValue); } 有关构建失败的屏幕截图,请参见下文 但是,当我注释断言时,构建成功: 相反,我在LinqPad 5 beta(使用Roslyn编译器)中运行了以下代码,没有任何问题: var obj = new { someValue = true }; dynamic asDynamic = obj; Console.WriteLine((asDynamic.someValue == true).ToString()); 真正 这里发生了什么?由于错误没有显示我不能说,如果我用dynamic,不正确或者如果它不能找到超载使用IsTrue(),因为的dynamic,或者如果这是在编译器中的错误(虽然我很怀疑这个,我没有任何证据表明我的代码有问题)。 关于过载问题,我尝试过,Assert.IsTrue((bool)asDynamic.someValue);但是构建仍然失败,仍然没有错误消息。 根据@RonBeyer的评论,我也尝试了更多如下的转换,但无济于事: dynamic asDynamic …

7
C#6.0功能不适用于Visual Studio 2015
我正在使用C#6.0测试Visual Studio 2015,但是语言功能无法正常工作。在MVC Web应用程序中,将编译以下代码: if (!string.IsNullOrWhiteSpace(Model.Profile?.TypeName)) { // More logic here... } 但是,当我通过Debug和IIS Express运行应用程序时,出现以下错误: CS1525:无效的表达式术语“。” 如何启用这些功能?

1
Roslyn SyntaxNodes是否可以重用?
我一直在研究Roslyn CTP,尽管它解决了与Expression Tree API类似的问题,但两者都是不可变的,但Roslyn却以完全不同的方式做到了: Expression节点没有对父节点的引用,而是使用进行了修改ExpressionVisitor,因此可以重复使用大部分部件。 SyntaxNode另一方面,罗斯林(Roslyn's )对其父节点进行了引用,因此所有节点实际上都成为了无法重用的块。类似的方法Update,ReplaceNode等等,提供了进行修改。 这在哪里结束?Document?Project?ISolution?API促进了树的逐步更改(而不是向上按钮),但是是否每个步骤都进行了完整复制? 他们为什么做出这样的选择?我缺少一些有趣的把戏吗?


4
微软Roslyn与CodeDom
从昨天在InfoWorld上有关新的Microsoft Roslyn的新闻稿中: 这种“解构”的编译器最明显的优点是,它允许从.Net应用程序中调用整个编译执行过程。Hejlsberg演示了一个C#程序,该程序将一些代码片段作为字符串传递给C#编译器。编译器将生成的IL汇编代码作为对象返回,然后将其传递给公共语言运行时(CLR)以执行。瞧!借助Roslyn,C#获得了动态语言在运行时生成和调用代码的能力。 自.NET 4发行以来,我就能够做到这一点CSharpCodeProvider.CompileAssemblyFromSource,实际上我在前一阵子编写的ASP.Net项目中使用了它,它确实做到了这一点-允许用户在文本框中键入代码,选择程序集/命名空间进行引用,然后即时执行并显示该代码的输出,以在Windows Azure上进行实时环境代码测试。 是CodeDom罗斯林的前驱者的一部分吗?罗斯林(Roslyn)的特殊好处是CodeDom什么?
110 .net  codedom  roslyn 

3
如何将msbuild升级到C#6?
我想在我的项目中使用C#6(零传播,其他功能)。 我已经在PC上安装了VS 2015,它的运行非常出色,并且可以像 var user = new SingleUserModel(); //all model fields are null var test = user.User?.Avatar?["blah"]; 但是,当我将项目推送到仓库并且CI开始构建它时,由于不受支持,构建失败?。 我也已经在CI服务器上安装了VS2015,但是看起来它没有使用它。我能做什么? CI-CruiseControl .NET使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

5
在罗斯林使用System.Dynamic
我修改了昨天发布的新版本Roslyn附带的示例,以使用动态和ExpandoObject,但我遇到了编译器错误,不确定如何解决。错误是: (7,21):错误CS0656:缺少编译器必需的成员'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' 您还可以在新的编译器中使用动态吗?我怎样才能解决这个问题?这是我更新的示例: [TestMethod] public void EndToEndCompileAndRun() { var text = @"using System.Dynamic; public class Calculator { public static object Evaluate() { dynamic x = new ExpandoObject(); x.Result = 42; return x.Result; } }"; var tree = SyntaxFactory.ParseSyntaxTree(text); var compilation = CSharpCompilation.Create( "calc.dll", options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary), syntaxTrees: new[] {tree}, references: …
96 c#  roslyn 

4
Roslyn无法编译代码
将项目从VS2013迁移到VS2015后,该项目将不再生成。以下LINQ语句中发生编译错误: static void Main(string[] args) { decimal a, b; IEnumerable<dynamic> array = new string[] { "10", "20", "30" }; var result = (from v in array where decimal.TryParse(v, out a) && decimal.TryParse("15", out b) && a <= b // Error here orderby decimal.Parse(v) select v).ToArray(); } 编译器返回错误: 错误CS0165使用未分配的局部变量'b' 是什么原因导致此问题?是否可以通过编译器设置修复它?
95 c#  .net  linq  roslyn 

6
没有roslyn的发布网站
我正在尝试使用Visual Studio 2015和.NET 4.5.1创建Web应用程序。发布网站时,Visual Studio将创建名为的文件夹roslyn。 我知道它曾经用于即时编译代码,但是不幸的是,我的托管服务提供商不允许我在其服务器上执行编译器。 如何在不roslyn使用Visual Studio早期版本的情况下发布网站? 编辑:尝试访问我的网站时出现此错误。 似乎IIS试图执行,roslyn\csc.exe但是我的用户帐户没有执行该操作的权限。在Visual Studio的早期版本中,不会显示此错误。

2
为什么在Roslyn中使用异步状态机类(而不是结构)?
让我们考虑一下这个非常简单的异步方法: static async Task myMethodAsync() { await Task.Delay(500); } 当我使用VS2013(Roslyn之前的编译器)进行编译时,生成的状态机是一个结构。 private struct <myMethodAsync>d__0 : IAsyncStateMachine { ... void IAsyncStateMachine.MoveNext() { ... } } 当我使用VS2015(Roslyn)进行编译时,生成的代码是这样的: private sealed class <myMethodAsync>d__1 : IAsyncStateMachine { ... void IAsyncStateMachine.MoveNext() { ... } } 如您所见,罗斯林生成一个类(而不是一个结构)。如果我没有记错的话,旧编译器中异步/等待支持的第一个实现(我猜是CTP2012)也会生成类,然后出于性能原因将其更改为struct。(在某些情况下,您可以完全避免装箱和分配堆…)(请参阅此) 有谁知道为什么在罗斯林再次改变了这一点?(对此我没有任何问题,我知道此更改是透明的,不会更改任何代码的行为,我很好奇) 编辑: 来自@Damien_The_Unbeliever(和源代码:))的答案可以解释一切。Roslyn的描述的行为仅适用于调试构建(由于注释中提到了CLR限制,因此需要这样做)。在Release中,它还会生成一个结构(具有所有好处。)。因此,这似乎是一个非常聪明的解决方案,可以同时支持“编辑”和“继续”以及更好的生产性能。有趣的东西,谢谢大家参加!

5
Roslyn“需要”什么/为什么在Asp.Net的/ bin文件夹中
有一堆相关的问题在此,虽然大部分的答案定义罗斯林和/或提供“修复”一些问题(exe与托管服务提供商等) 我似乎无法追踪的是中的“为什么”和“目的”(也许仅在ASP.Net MVC / Web API的上下文中)/bin/roslyn。 我遇到了类似的问题(托管-.exe限制,支持4.6等),我的“解决方案”是“仅部署到Azure”(当然,一切正常。)但是实际上,这并不能回答: 为什么需要它们? 这是否意味着它们被用于runtime编译(我的大脑指出了这一点,但这是一个完整的猜测/我也许是错的骗子),如该SO帖子所示-除非更正,否则为“它”(下文中有更多介绍)。 似乎“删除软件包”是一个“修复” (根据过去的一些答案),但如果是这样,它(重新)会产生问题 我认为了解这一点将有所帮助-例如,我不能成为唯一看到.exe“需要”的人而扬眉的人。 更新资料 证明“隐藏的宝石”的存在:)我已经读了一遍又一遍...毕竟它已经存在了一段时间了- 但不是评论线程-最初引用的链接(大约在2014年)已由Microsoft和注释不再显示。幸运的是,下面是相关部分。 大错误-一直在盯着我(或至少自从这次交流以来): Dmitry Dzygin 2015年6月2日上午12:53 我已经尝试了NuGet软件包的最新版本,但是加载/执行编译器的方式似乎有所不同。 在v0.2.0.0中,Roslyn编译器将被加载到内存中,从而极大地提高了具有多个* .as * x / *。cshtml文件的未预编译网站的性能。但是,新版本具有一个新/bin/roslyn/csc.exe文件,该文件每个文件执行一次,从而完全删除了上述优化功能..... 金: XMao 2015年6月2日下午1:22 @Dmitry的的工作csc.exe中/bin/Roslyn是调用VBCSCompiler.exe,在同一文件夹它坐落。VBCSCompiler.exe 是执行实际编译工作的过程。如果VBCSCompiler已经在运行,则csc.exe将对其进行重用,因此我们仍将获得所提及的性能改进。 嗯... 更新:10/2017 似乎这与所有时间有关,因此需要进一步更新。 @Donny V下面的答案是一个选择。通过完全编译您的应用程序(包括所有Views(.cshtml/ .vbhtml)),您无需exe在应用程序中使用它。 即使Visual Studio(到今天,VS 2017,令人困惑)仍会/bin/roslyn在Publish过程中创建及其内容,即使设置了“ full compile”,也是如此。 您可以通过测试该排除的/bin/roslyn文件夹,并推动应用程序到你的托管服务提供商时,它的内容。 警告: 如前所述,完全编译您的应用程序意味着您必须重新编译它,即使是View更改级别也是如此。

1
如何使我的代码诊断语法节点操作对关闭的文件起作用?
我正在使用Roslyn(在VS2015 Preview中)构建一组代码诊断。理想情况下,我希望它们产生的任何错误都可以作为持久错误,就像我违反了正常的语言规则一样。 有很多选择,但是我很难让其中任何一个都能一致地工作。我设法实现了基本的语法节点操作,即已向 context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression); 在Initialize我的诊断课的方法中。瞧,当我打开一个违反此诊断的文件时(运行VSIX项目时),VS2015显示错误: 正确的代码下的红色花体 边缘有红色方块 错误列表中的错误 但是,关闭文件时错误消失了。 我也尝试过使用context.RegisterCompilationEndAction,但这有两个问题: 它似乎不一致地发射。通常,当我打开解决方案时,它会触发,但并非总是如此。它不会在清理/重建时启动,这似乎很奇怪。 尽管直接在分析方法中创建的诊断会触发,但为了实现诊断,我正在使用访问者,如下所示-这可能是无能的: private static void AnalyzeEndCompilation(CompilationEndAnalysisContext context) { foreach (var tree in context.Compilation.SyntaxTrees) { var visitor = new ReportingVisitor(context.Compilation.GetSemanticModel(tree)); visitor.Visit(tree.GetRoot()); foreach (var diagnostic in visitor.Diagnostics) { context.ReportDiagnostic(diagnostic); } } } 我知道正在创建诊断程序-ReportDiagnostic多次击中断点-但在错误列表中没有看到任何内容。(与此同时ReportDiagnostic,在方法开始时会显示一个类似的调用,或者会在每个带有文件路径的语法树中显示一个调用。) 我在这里做错了什么?如果可行,第一种方法(语法节点操作)将是理想的-它恰好为我提供了所需的上下文。我是否需要在项目属性中进行一些设置,以使编译器将其用于“完整项目”编译以及交互式“在IDE中”处理?这可能只是Roslyn集成的一部分,还没有完成? (如果有用的话,我可以包括该类的完整代码-在这种情况下,我怀疑它比信号要多的噪音。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.