Roslyn MSBuild工作区添加了额外的斜杠?

时间:2018-05-09 03:47:45

标签: visual-studio msbuild roslyn msbuild-task

所以我的设置是:

Microsoft.CodeAnalysis,v.2.7.0 .... Microsoft.Build,v.15.6.85

这是一个网络应用。

我有以下代码:

var msWorkspace = MSBuildWorkspace.Create();
var solution = msWorkspace.OpenSolutionAsync(filePath).Result;

基本上,我想加载本地(服务器本地)解决方案并对其进行一些分析。

然而,加载它似乎会导致问题,例如:

处理文件' C:\ Projects \ Project.csproj&#39>时,Msbuild失败消息:

  

" RazorCodeGen"无法从程序集中实例化任务   " C:\项目\包\ RazorGenerator.MsBuild.2.4.1 \建立\\ .. \工具\ RazorGenerator.MsBuild.dll&#34 ;.   请验证是否已使用相同版本构建任务程序集   Microsoft.Build.Framework程序集作为您安装的程序集   计算机和您的主机应用程序没有错过绑定   重定向到Microsoft.Build.Framework。无法转换类型的对象   ' RazorGenerator.MsBuild.RazorCodeGen'输入   ' Microsoft.Build.Framework.ITask'

请注意,错误消息中的路径包含: 建立\\ .. \工具。

看起来路径中有\\。

  1. 删除额外的尾部斜杠允许我打开任务(所以它 确实存在并且存在)。

  2. 使用Visual Studio 2017社区打开并构建解决方案 版本有效。

  3. 使用MSBuild(v.15.0)构建解决方案也很有效。

  4. 我已经将绑定重定向从MSBuild.exe.config添加到我的应用程序Web.Config。

    更新:

    刚写了几行代码,尝试使用Microsoft.Build.Execution.BuildManager构建解决方案,并且具有相同的错误。所以似乎问题出在MSBuild而不是Roslyn / MSBuildWorkspace。

2 个答案:

答案 0 :(得分:0)

  

Roslyn MSBuild工作区添加了额外的斜杠?

检查项目RazorGenerator.MsBuild中使用的Microsoft.Build.Framework程序集后,会发现它是针对旧版本的MSBuild 4.0编译的。当应用程序无法处理ITask的多个不同定义(Microsoft.Build中的新定义,v.15.6.85)时,就会出现此错误。

要解决此问题,您可以尝试默认Microsoft.Build.Framework引用v4.0或添加Binding Redirects

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="15.1.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Build.Framework" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
        <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="15.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Build" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
        <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="15.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

查看this thread了解更多详情。

答案 1 :(得分:-3)

从目录访问时:
\\local-pc\Bases\System under development\ERP-不起作用。

但是当我放置项目并浏览目录时:
D:\Bases\System under Development\ERP\System-有效

我的D:被映射到local-pc

这意味着RazorCodeGen正在寻找位置,并且该项目已被另一个位置打开。