检出的分支Update-1从罗斯林GitHub的仓库,建设CSC.EXE和编译与CSC.EXE版本我只是给自己建了一个随机的解决方案.
我希望该性能可与VS 2015 Update 1附带的原始Roslyn版本相媲美,该版本位于路径中: C:\Program Files (x86)\MSBuild\14.0\Bin
与原始版本相比,我自己构建的Roslyn版本的构建性能要差得多.在我测试中使用的解决方案中:大约30秒对65秒.
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>
我试图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) 我想在 Azure DevOps Repos 的相应拉取请求中显示 Azure Pipelines 中管道构建的状态。
我想有一些指示符显示构建成功或失败,如下所示(请注意,这是来自 microsoft docs 页面的屏幕截图,也在下面提到):

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