标签: roslyn

在Roslyn中使用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: new[] {new MetadataFileReference(typeof (object).Assembly.Location), new MetadataFileReference(typeof (ExpandoObject).Assembly.Location)});

    Assembly compiledAssembly;
    using (var stream = new MemoryStream())
    {
        var compileResult = compilation.Emit(stream);
        compiledAssembly = Assembly.Load(stream.GetBuffer());
    }

    Type calculator = compiledAssembly.GetType("Calculator");
    MethodInfo evaluate …
Run Code Online (Sandbox Code Playgroud)

c# roslyn

94
推荐指数
3
解决办法
3万
查看次数

为什么Roslyn中的异步状态机类(而不是结构)?

让我们考虑一下这个非常简单的异步方法:

static async Task myMethodAsync() 
{
    await Task.Delay(500);
}
Run Code Online (Sandbox Code Playgroud)

当我用VS2013(前Roslyn编译器)编译它时,生成的状态机是一个结构.

private struct <myMethodAsync>d__0 : IAsyncStateMachine
{  
    ...
    void IAsyncStateMachine.MoveNext()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用VS2015(Roslyn)编译它时生成的代码是这样的:

private sealed class <myMethodAsync>d__1 : IAsyncStateMachine
{
    ...
    void IAsyncStateMachine.MoveNext()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,Roslyn生成一个类(而不是结构).如果我没记错的话,旧编译器中的async/await支持的第一个实现(我认为是CTP2012)也生成了类,然后由于性能原因将其更改为struct.(在某些情况下,你可以完全避免拳击和堆分配......)(见这个)

有谁知道为什么罗斯林再次改变了这一点?(我对此没有任何问题,我知道这个改变是透明的,不会改变任何代码的行为,我只是好奇)

编辑:

来自@Damien_The_Unbeliever(以及源代码:))imho的答案解释了一切.描述的Roslyn行为仅适用于调试版本(由于注释中提到的CLR限制,这是必需的).在Release中它还生成一个结构(具有该​​...的所有好处).所以这似乎是一个非常聪明的解决方案,支持编辑和继续以及更好的生产性能.有趣的东西,感谢所有参与的人!

.net c# language-lawyer roslyn

86
推荐指数
2
解决办法
3170
查看次数

发布没有roslyn的网站

我正在尝试使用Visual Studio 2015和.NET 4.5.1创建Web应用程序.当我发布网站时,visual studio创建了名为的文件夹roslyn.

在此输入图像描述

我知道它用于动态编译代码,但不幸的是我的托管服务提供商不允许我在他们的服务器上执行编译器.

如何在不使用roslyn以前版本的Visual Studio的情况下发布网站?

编辑:我试图访问我的网站时遇到此错误.

在此输入图像描述

似乎IIS尝试执行roslyn\csc.exe但我的用户帐户没有这样做的权限.使用以前版本的Visual Studio,此错误不会显示.

visual-studio roslyn visual-studio-2015

85
推荐指数
2
解决办法
5万
查看次数

如何使我的代码诊断语法节点操作适用于已关闭的文件?

我正在使用Roslyn(在VS2015 Preview中)构建一组代码诊断.理想情况下,我希望他们产生的任何错误都可以作为持久性错误,就像我违反了正常的语言规则一样.

有很多选择,但我很难让他们中的任何一个一致地工作.我已经设法实现了一个基本的语法节点动作,即注册的一个

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
Run Code Online (Sandbox Code Playgroud)

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);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我知道正在创建诊断 - ReportDiagnostic线路上的断点被多次击中 - 但我没有在错误列表中看到任何内容.(尽管类似ReportDiagnostic的方法,或用每文件路径语法树一开始通话,得到显示.)

我在这做错了什么?如果可行的话,第一种方法(语法节点动作)将是理想的 - 它完全给出了我需要的上下文.项目属性中是否有一些设置需要使编译器使用"完整项目"编译以及"在IDE中处理"交互?这可能只是Roslyn集成的一点还没有完成吗?

(如果它有用的话,我可以包括该类的完整代码 - 在这种情况下,我怀疑它会比信号更多噪音.)

c# roslyn vs-2015-preview

70
推荐指数
1
解决办法
3604
查看次数

什么/为什么Roslyn"需要"在Asp.Net的/ bin文件夹中

虽然大多数答案定义了 Roslyn和/或为某些问题提供了"修复"(与托管服务提供商等),但是有很多相关的问题.exe

我似乎无法追查的是"为什么"和"为什么"(可能仅在ASP.Net MVC/Web API的上下文中)/bin/roslyn.

我遇到了类似的问题(托管 - .exe限制,支持4.6等),我的"修复"是"只是部署到Azure"(当然一切都顺利).但实际上,这并没有回答:

  • 他们为什么需要?
  • 这是否意味着他们用于runtime编译(我的大脑指向这个,但这是一个完整的猜测/我可能是错误的grok),正如这篇SO帖子所示 - 除非纠正,这是"它"(更多下面).
  • 似乎"删除包"是一个"修复" (基于一些过去的答案),但如果是这样,它(重新)回答问题

我认为理解这一点会有所帮助 - 例如,我不可能是唯一一个会看到.exe"需要" 的眉毛......


更新

去表明存在"隐藏的宝石":)我已经一遍又一遍地阅读 ......毕竟它已经存在了一段时间 - 但不是评论主题.大错 - 它一直盯着我(或者至少从这次交换开始):

Dmitry Dzygin 2015年6月2日12:53 AM

我已经尝试了最新版本的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 …

roslyn asp.net-web-api asp.net-mvc-5

69
推荐指数
3
解决办法
5万
查看次数

lambda表达式中的枚举编译方式不同; 重载分辨率提高的结果?

在尝试Visual Studio 2015 RC时,我收到了以前正在运行的代码的运行时错误.给定(x => x.CustomerStatusID == CustomerStatuses.Active)作为a传递给函数的lambda Expression<>,调试器在表达式树中显示差异.以前编译为:

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == 0
}
Run Code Online (Sandbox Code Playgroud)

但是在C#6.0中它现在编译为

.Lambda #Lambda1<System.Func`2[Services.DataClasses.CustomerDC,System.Boolean]>(Services.DataClasses.CustomerDC $x)
{
    (System.Int32)$x.CustomerStatusID == (System.Int32).Constant<Services.DataClasses.CustomerStatuses>(Active)
}
Run Code Online (Sandbox Code Playgroud)

虽然我的树遍历代码的修复是直截了当的,并且额外的细节是值得赞赏的,有没有人知道任何其他陷阱漂浮这样?

或者,是否有人链接到有关如何改进重载决策的细节的信息?我找不到任何东西.

c# lambda enums roslyn c#-6.0

68
推荐指数
1
解决办法
1954
查看次数

代码分析窗口在哪里消失了?

在Visual Studio 2013中,我使用"代码分析"窗口向开发和管理团队提供报告.

Visual Studio 2013中的

在Visual Studio 2015 Enterprise RTM中,这些错误已返回到错误窗口,我不再只能查看单个项目的CA问题,或按类型过滤它们.

有没有办法将代码分析窗口带回来?

code-analysis roslyn visual-studio-2015

67
推荐指数
1
解决办法
2万
查看次数

试着去理解?C#中的(null-conditional)运算符

我有一个非常简单的例子:

class Program
{
    class A
    {
        public bool B;
    }

    static void Main()
    {
        System.Collections.ArrayList list = null;

        if (list?.Count > 0)
        {
            System.Console.WriteLine("Contains elements");
        }

        A a = null;

        if (a?.B)
        {
            System.Console.WriteLine("Is initialized");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

if (list?.Count > 0)编译完美,这意味着如果listnull,表达式Count > 0变为false默认.

但是,该行if (a?.B)抛出编译器错误,表示我无法隐式转换bool?bool.

为什么一个人与另一个人不同?

c# nullable roslyn c#-6.0 null-conditional-operator

62
推荐指数
2
解决办法
5760
查看次数

为什么此代码会使Visual Studio 2015崩溃?

出于某种原因,即使在Visual Studio中将其键入C#文件也足以导致它立即崩溃.为什么?

unsafe struct node {
    node*[] child;
}
Run Code Online (Sandbox Code Playgroud)

当IDE开始为关键字等着色时,似乎会发生这种情况.

在TIO中试用它会发出一些csc.exe exited with code 1不太有用的东西.

虽然C#中的数组声明与C/C++中的数组声明不同,但上面看起来应该完全有效.为什么不是,为什么它会导致Visual Studio崩溃?

我的Visual Studio版本是14.0.23107.

c# visual-studio roslyn visual-studio-2015

61
推荐指数
1
解决办法
2261
查看次数

VBCSCompiler.exe的大量实例

我刚刚下载并安装了Visual Studio Professional 2015(14.0.23107.0).我第一次打开解决方案(28个项目)并执行构建 - >重建解决方案时,我的开发机器出现了绝对的爬行现象.CPU的最大值为100%,构建从未完成 - 即使在> 10分钟后也是如此.

我打开了Windows任务管理器并注意到:> 10个VBCSCompiler.exe任务正在运行.合并后,这些任务使CPU> 90%.

知道为什么有这么多这些任务在运行吗?有什么方法可以阻止这种情况发生?

这是我能遇到同样问题的其他人最接近的事情:https://github.com/dotnet/roslyn/issues/2790

更新(8/7)

-Hans Passant,很棒的想法.我的经理向我提供了这个版本(14.0.23107.0).这是"官方发布"的正确版本吗?我并没有故意安装任何Visual Studio 2015的每个版本.我不认为有任何beta版本.

-Kyle Trauberman,我对Visual Studio环境中的环境变量并不熟悉; 然而,我天真地跑了set DisableRosyln=true在VS(和MSBuild)命令提示符窗口中运行.这似乎没有任何影响.即使重启VS2015,VBCSCompiler.exe也会显示正确的备份.

我修复了我的VS2015安装并执行了重启.这没有用.

更新第2部分(8/7) Passant,非常令人印象深刻的写作!虽然这次问题没有发生,但我看了你描述的事情:

至于加载了VBCSCompiler.exe的模块,这就是我所拥有的:

在此输入图像描述

有趣的是,我们的.NET核心程序集有不同的版本.你的赔率是4.06.79,而我是4.06.81.

我的"客户端dll"(位于C:\ Program Files(x86)\ MSBuild\14.0\Bin\Microsoft.Build.Tasks.CodeAnalysis.dll)与您的版本和时间戳相同: 在此输入图像描述

奇怪的是,当我查看ILSpy中的代码时,我看到一些略有不同的东西 - 也许是优化?

    private static NamedPipeClientStream TryAllProcesses(string pipeName, int timeoutMs, CancellationToken cancellationToken, out string newPipeName)
{
    string str = pipeName;
    int num = 1;
    while (File.Exists(string.Format("\\\\.\\pipe\\{0}", pipeName)))
    {
        NamedPipeClientStream result;
        if ((result = BuildClient.TryConnectToProcess(pipeName, timeoutMs, cancellationToken)) != null)
        {
            newPipeName = pipeName; …
Run Code Online (Sandbox Code Playgroud)

.net c# roslyn visual-studio-2015

58
推荐指数
3
解决办法
3万
查看次数