所以我的设置是:
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'
请注意,错误消息中的路径包含: 建立\\ .. \工具。
看起来路径中有\\。
删除额外的尾部斜杠允许我打开任务(所以它 确实存在并且存在)。
使用Visual Studio 2017社区打开并构建解决方案 版本有效。
使用MSBuild(v.15.0)构建解决方案也很有效。
我已经将绑定重定向从MSBuild.exe.config添加到我的应用程序Web.Config。
更新:
刚写了几行代码,尝试使用Microsoft.Build.Execution.BuildManager构建解决方案,并且具有相同的错误。所以似乎问题出在MSBuild而不是Roslyn / MSBuildWorkspace。
答案 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正在寻找位置,并且该项目已被另一个位置打开。