【问题标题】:Roslyn, MSBuildWorkspace.Create not working with msbuild 14 or 12Roslyn,MSBuildWorkspace.Create 不适用于 msbuild 14 或 12
【发布时间】:2015-06-27 00:31:43
【问题描述】:

我在尝试编写一段代码分析然后通过 MSBuild 任务运行它时遇到了这个奇怪的问题。当我使用 MSBuild 运行时,我使用 MSBuildWorkspace.Create 来创建工作区。但是,此方法仅在运行 .net Framework 目录中的 MSBuild 版本时才有效,而 v12 (2013) 和 v14 (2015) 都崩溃了。

见下文

    [TestMethod]
    public void RunThroughMsBuild()
    {
        RunMsBuild(@"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe");//Succeeds
        RunMsBuild(@"C:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe");//Fails
        RunMsBuild(@"C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe");//Fails
    }

    private static void RunMsBuild(string msbuildLocation)
    {
        var process = Process.Start(new ProcessStartInfo(msbuildLocation, ProjectFileLocation)
        {
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true
        });

        Debug.Write(process.StandardOutput.ReadToEnd());
        process.WaitForExit();

        Assert.IsTrue(process.HasExited);
        Assert.AreEqual(0, process.ExitCode);
    }

我得到的错误更奇怪:

  • [0] {“来自程序集“Microsoft.CodeAnalysis.Workspaces,版本=1.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”的“Microsoft.CodeAnalysis.AssemblyReferenceResolver”类型中的方法“ResolveReference”没有实现。 ":"Microsoft.CodeAnalysis.AssemblyReferenceResolver"} System.Exception {System.TypeLoadException}
  • [1] {“方法 'get_Locations' 中的类型 'Microsoft.CodeAnalysis.CodeGeneration.CodeGenerationArrayTypeSymbol' 来自程序集 'Microsoft.CodeAnalysis.Workspaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 没有实施。":"Microsoft.CodeAnalysis.CodeGeneration.CodeGenerationArrayTypeSymbol"} System.Exception {System.TypeLoadException}

还有 16 个……

抛出这个异常的代码很简单:

var workspace = MSBuildWorkspace.Create();

【问题讨论】:

    标签: c# .net msbuild roslyn msbuild-task


    【解决方案1】:

    在这种情况下的问题是,通过 Visual Studio 添加引用会从错误的来源添加它们。 v12 和 v14 MSBuild 位置有自己的与 MSBuild 相关的程序集。消费这些解决了这个问题,但下一个问题是你不能根据这个问题从 MSBuild 任务中使用 MSBuildWorkspace:

    Can I access the MsBuildWorkspace from within a MsBuild Task class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多