小编Ale*_*lex的帖子

自编Roslyn构建性能:不如最初发布的Roslyn版本快

我用一句话做什么

检出的分支Update-1罗斯林GitHub的仓库,建设CSC.EXE和编译与CSC.EXE版本我只是给自己建了一个随机的解决方案.

预期结果

我希望该性能可与VS 2015 Update 1附带的原始Roslyn版本相媲美,该版本位于路径中: C:\Program Files (x86)\MSBuild\14.0\Bin

实际结果

与原始版本相比,我自己构建的Roslyn版本的构建性能要差得多.在我测试中使用的解决方案中:大约30秒对65秒.

我的程序更详细

  • 克隆https://github.com/dotnet/roslyn.git并签出分支更新-1
  • 使用Release配置构建Roslyn (尝试使用两者,Mixed Configuration以及x64解决方案平台.)
  • 为了编译测试解决方案,我更改了所有项目文件以使用csc路径的特定位置:

    <CscToolPath>C:\Path\To\Output\Location\Of\Roslyn\Binaries\</CscToolPath>

  • 出于测试目的,我正在从命令行构建测试解决方案

    MSBuild.exe /t:Rebuild /m:1 /verbosity:m MySolutionName.sln

  • 我之前也在干净:

    MSBuild.exe /t:Clean /m:1 /verbosity:m MySolutionName.sln

  • 为了测试VS 2015 Update 1附带的原始编译器,我将项目文件中的配置更改为:

    <CscToolPath>C:\Program Files (x86)\MSBuild\14.0\Bin\</CscToolPath>

问题

  • 我可以做些什么来实现与我自编的Roslyn版本相似的性能,就像最初发布的Roslyn dll一样?
  • 在构建Roslyn本身时还有其他事情(比如优化等)吗?

.net msbuild roslyn

8
推荐指数
1
解决办法
929
查看次数

可靠地将类型符号(ITypeSymbol)与Roslyn进行比较

我试图ITypeSymbol在以下情况下可靠地比较两种最简单和最直接的方式(我在一个更大的项目中遇到了这些问题,并试图尽可能地简化它):

我有这个SyntaxTree的CSharpCompilation:

  namespace MyAssembly
  {
    public class Foo
    {
      public Foo(Foo x)
      {
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我们正在穿过树CSharpSyntaxRewriter,改变班级并更新Compilation.在第一次运行中,我们记住ITypeSymbol第一个构造函数参数(在本例中是类本身的类型).更新编译后,我们再次调用相同的重写器,并再次从构造函数参数中获取ITypeSymbol.之后,我比较了两个我期望代表相同类型的ITypeSymbol MyAssembly.Foo.

我的第一个比较方法是调用ITypeSymbol.Equals()方法,但它正在返回false.它基本上返回,false因为我们改变了编译并SemanticModel在此期间得到了一个新的.如果我们不这样做,Equals()方法实际上返回true.

比较DeclaringSyntaxReferences(如此处所述如何比较Roslyn中不同项目的类型符号(ITypeSymbol))返回false,因为我们Foo在此期间更改了类本身.如果构造函数参数是类型的Bar并且我们重写了,那么行为将是相同的Bar.要验证这一点,只需取消注释该行

//RewriteBar(rewriter, compilation, resultTree); 
Run Code Online (Sandbox Code Playgroud)

Bar在代码示例中替换构造函数参数类型.

结论: ITypeSymbol.Equals()不适用于新的编译和语义模型,并且比较DeclaringSyntaxReferences不适用于我们同时更改的类型.(我还测试了一种外部程序集的行为 - 在这种情况下,ITypeSymbol.Equals()为我工作.)

所以我的问题是:

  • 在描述的情况下比较类型的预期方法是什么?
  • 是否有一个单一的解决方案或者我是否需要混合/组合不同的方法来确定类型相等(也可能考虑完全限定名称的字符串表示)?

这是完整的测试程序,使用该程序可以重现该问题.只需复制,包含Roslyn引用并执行:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace Demo.TypeSymbol
{
  class …
Run Code Online (Sandbox Code Playgroud)

.net c# roslyn roslyn-code-analysis

7
推荐指数
1
解决办法
1069
查看次数

如何在 Azure DevOps 中的拉取请求中显示构建状态

我想在 Azure DevOps Repos 的相应拉取请求中显示 Azure Pipelines 中管道构建的状态。

我想有一些指示符显示构建成功或失败,如下所示(请注意,这是来自 microsoft docs 页面的屏幕截图,也在下面提到): 公关状态

在我的研究中,我遇到了不同的解决方案,包括以下解决方案:

azure-devops azure-pipelines azure-repos

6
推荐指数
1
解决办法
3299
查看次数