Roslyn MSBuild Workspace加载时路径含多余反斜杠致任务实例化失败?
结合你遇到的这个MSBuild任务实例化错误,我整理了对应的问题细节和可行的解决思路,咱们一起来看看:
- 类型:Web应用程序
- 依赖组件:
Microsoft.CodeAnalysis v2.7.0、Microsoft.Build v15.6.85
我通过以下代码尝试加载服务器本地的解决方案做分析:
var msWorkspace = MSBuildWorkspace.Create(); var solution = msWorkspace.OpenSolutionAsync(filePath).Result;
但加载时触发MSBuild失败,处理C:\Projects\Project.csproj时抛出错误:
无法从程序集"C:\Projects\packages\RazorGenerator.MsBuild.2.4.1\build\..\tools\RazorGenerator.MsBuild.dll"实例化"RazorCodeGen"任务。请确认该任务程序集与计算机上安装的Microsoft.Build.Framework版本一致,且宿主应用程序未缺失Microsoft.Build.Framework的绑定重定向。无法将类型'RazorGenerator.MsBuild.RazorCodeGen'转换为'Microsoft.Build.Framework.ITask'。
注意错误路径里存在多余的反斜杠:build\\..\tools
- 手动移除路径中的多余反斜杠后,任务可以正常打开
- Visual Studio 2017社区版能正常打开并构建该解决方案
- 使用MSBuild v15.0可正常构建解决方案
- 已将MSBuild.exe.config中的绑定重定向规则添加到应用程序的Web.Config中
更新:尝试用Microsoft.Build.Execution.BuildManager构建解决方案时,出现完全相同的错误,说明问题根源在MSBuild本身,而非Roslyn/MSBuildWorkspace。
1. 修复RazorGenerator.MsBuild包的路径配置
错误里的双反斜杠大概率是包内.targets文件的路径写法问题。找到C:\Projects\packages\RazorGenerator.MsBuild.2.4.1\build\RazorGenerator.MsBuild.targets文件,检查其中引用RazorCodeGen任务的路径,把build\\..\tools这类写法改成build/../tools或者直接简化为../tools,避免双反斜杠导致的路径解析异常。
2. 确保绑定重定向版本匹配
虽然你已经添加了绑定重定向,但可能版本兼容性还是有问题。确认Web.Config里的Microsoft.Build.Framework重定向规则,指向和RazorGenerator.MsBuild.dll兼容的版本。比如如果该包是基于MSBuild 15.0编译的,可以添加如下重定向:
<dependentAssembly> <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-15.6.85" newVersion="15.0.0.0" /> </dependentAssembly>
3. 强制MSBuildWorkspace使用兼容的工具链
既然VS2017和MSBuild 15.0能正常构建,你可以手动指定MSBuildWorkspace使用对应版本的MSBuild工具路径,确保环境一致:
var msBuildProps = new Dictionary<string, string> { { "MSBuildSDKsPath", @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sdks" }, { "MSBuildToolsPath", @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin" } }; var msWorkspace = MSBuildWorkspace.Create(msBuildProps); var solution = msWorkspace.OpenSolutionAsync(filePath).Result;
4. 更新或替换RazorGenerator.MsBuild包
你使用的2.4.1版本比较老旧,可能存在路径解析的bug。尝试更新到该包的最新稳定版,或者考虑使用Razor类库等替代方案,看看是否能解决任务实例化的问题。
内容的提问来源于stack exchange,提问作者Pavel Donchev

