Visual Studio 2015 异常 SqlScriptPreprocessSqlVariables 运行 带有更新数据库的 Web 发布向导
Visual Studio 2015 exception SqlScriptPreprocessSqlVariables when running web publish wizard with update database
更新:
我用一个新的空 VS2015 WebApplication 项目重现了同样的错误。
- 向新的空 SQL 数据库添加了一个 connectionString
- 向解决方案添加了一个 sql-脚本文件,并在发布向导中选择了发布...。
Example of web Publish wizard with included Update script.
我将在构建网络部署包或网络部署时遇到同样的错误。
原文post:
"SqlScriptPreprocessSqlVariables" 任务意外失败。当我将发布向导或 MSBuild 与选择了更新数据库的配置文件一起使用时,会发生这种情况。在一台只有 VS2015 Update1 的新安装的机器上,也在我们的带有 Team Fondation Server 2015 Build Agent 的构建服务器上。相同的发布配置文件适用于我们的 VS2013 环境。
System.TypeLoadException: Signature of the body and declaration in a method implementation do not match.
Type: 'Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlCommandExecuter'.
Assembly: 'Microsoft.Web.Publishing.Tasks, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlScriptPreprocessSqlVariables.Execute()
at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask>d__26.MoveNext()
这是相同的错误,但来自新构建系统中的构建代理。我在新代理上运行 XAML 时遇到了同样的错误。
##[error]C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Deploy\Microsoft.Web.Publishing.MSDeploy.Common.targets(119,5): Error MSB4018: The "SqlScriptPreprocessSqlVariables" task failed unexpectedly.
##[error]System.TypeLoadException: Signature of the body and declaration in a method implementation do not match. Type: 'Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlCommandExecuter'. Assembly: 'Microsoft.Web.Publishing.Tasks, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
##[error] at Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlScriptPreprocessSqlVariables.Execute()
##[error] at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
##[error] at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
这就是我解决 webdeploy 打包问题的方法。这不是我推荐的解决方案,但它适用于我的机器和构建服务器。
找到文件 Microsoft.Web.Publishing.MsDeploy.Common.targets
这是我机器上的位置:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Deploy\ Microsoft.Web.Publishing.MsDeploy.Common.targets
在第 117 行及之后,我注释掉了以下部分。
<!--<SqlScriptPreprocessSqlVariables
UnsupportedKeywords="$(MsdeploySqlUnsupportedCommand)" CheckForUnsupportCommands="$(CheckSqlScriptForUnsupportedCommands)"
TreadSqlScriptUnsupportedCommandsAsWarning="$(TreadSqlScriptUnsupportedCommandsAsWarning)"
SqlScriptFile="%(_DatabasesToPackageForSQL.SourcePath)"
DestinationGroup="%(_DatabasesToPackageForSQL.DestinationGroup)"
ResolveIncludes="$(SqlScriptPreProcessResolveIncludes)"
BatchDelimiter="$(SqlScriptPreProcessBatchDelimiter)"
Condition="$(EnableSqlScriptVariableParameterize) And '%_DatabasesToPackageForSQL.SourcePath)' != '' And Exists('%(_DatabasesToPackageForSQL.SourcePath)') ">
<Output TaskParameter="List" ItemName="_DatabasesToPackage_SqlVariables" />
</SqlScriptPreprocessSqlVariables>-->
我最近遇到了同样的问题,我通过安装最新版本的 "SQL Server Data Tools" 并重新启动机器解决了这个问题。正如@JimAho 提到的,问题与安装的 SQL Server Data Tools 版本有关。
Here you could download it
别忘了重启机器。
对这些解决方案仍然不是很满意,我做了一些研究,我看到的侵入性最小的方法就是在 GAC 中简单地注册程序集。
- 运行 VS 命令提示符作为管理员
- 点击Windows开始
- 输入"Developer"
- 右击"Developer Command Prompt for VS 2017"
- Select 运行 作为管理员
- 运行 以下命令(将 Enterpise 替换为您的安装,例如 Professional、BuildTools、Community):
gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\Common7\IDE\Extensions\Microsoft\SQLCommon0\Microsoft.SqlServer.BatchParser.dll"
更新: 我用一个新的空 VS2015 WebApplication 项目重现了同样的错误。
- 向新的空 SQL 数据库添加了一个 connectionString
- 向解决方案添加了一个 sql-脚本文件,并在发布向导中选择了发布...。
Example of web Publish wizard with included Update script.
我将在构建网络部署包或网络部署时遇到同样的错误。
原文post: "SqlScriptPreprocessSqlVariables" 任务意外失败。当我将发布向导或 MSBuild 与选择了更新数据库的配置文件一起使用时,会发生这种情况。在一台只有 VS2015 Update1 的新安装的机器上,也在我们的带有 Team Fondation Server 2015 Build Agent 的构建服务器上。相同的发布配置文件适用于我们的 VS2013 环境。
System.TypeLoadException: Signature of the body and declaration in a method implementation do not match.
Type: 'Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlCommandExecuter'.
Assembly: 'Microsoft.Web.Publishing.Tasks, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
at Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlScriptPreprocessSqlVariables.Execute()
at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask>d__26.MoveNext()
这是相同的错误,但来自新构建系统中的构建代理。我在新代理上运行 XAML 时遇到了同样的错误。
##[error]C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Deploy\Microsoft.Web.Publishing.MSDeploy.Common.targets(119,5): Error MSB4018: The "SqlScriptPreprocessSqlVariables" task failed unexpectedly.
##[error]System.TypeLoadException: Signature of the body and declaration in a method implementation do not match. Type: 'Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlCommandExecuter'. Assembly: 'Microsoft.Web.Publishing.Tasks, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
##[error] at Microsoft.Web.Publishing.Tasks.SqlScriptPreprocessor.SqlScriptPreprocessSqlVariables.Execute()
##[error] at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
##[error] at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
这就是我解决 webdeploy 打包问题的方法。这不是我推荐的解决方案,但它适用于我的机器和构建服务器。
找到文件 Microsoft.Web.Publishing.MsDeploy.Common.targets
这是我机器上的位置:
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Deploy\ Microsoft.Web.Publishing.MsDeploy.Common.targets
在第 117 行及之后,我注释掉了以下部分。
<!--<SqlScriptPreprocessSqlVariables
UnsupportedKeywords="$(MsdeploySqlUnsupportedCommand)" CheckForUnsupportCommands="$(CheckSqlScriptForUnsupportedCommands)"
TreadSqlScriptUnsupportedCommandsAsWarning="$(TreadSqlScriptUnsupportedCommandsAsWarning)"
SqlScriptFile="%(_DatabasesToPackageForSQL.SourcePath)"
DestinationGroup="%(_DatabasesToPackageForSQL.DestinationGroup)"
ResolveIncludes="$(SqlScriptPreProcessResolveIncludes)"
BatchDelimiter="$(SqlScriptPreProcessBatchDelimiter)"
Condition="$(EnableSqlScriptVariableParameterize) And '%_DatabasesToPackageForSQL.SourcePath)' != '' And Exists('%(_DatabasesToPackageForSQL.SourcePath)') ">
<Output TaskParameter="List" ItemName="_DatabasesToPackage_SqlVariables" />
</SqlScriptPreprocessSqlVariables>-->
我最近遇到了同样的问题,我通过安装最新版本的 "SQL Server Data Tools" 并重新启动机器解决了这个问题。正如@JimAho 提到的,问题与安装的 SQL Server Data Tools 版本有关。 Here you could download it
别忘了重启机器。
对这些解决方案仍然不是很满意,我做了一些研究,我看到的侵入性最小的方法就是在 GAC 中简单地注册程序集。
- 运行 VS 命令提示符作为管理员
- 点击Windows开始
- 输入"Developer"
- 右击"Developer Command Prompt for VS 2017"
- Select 运行 作为管理员
- 运行 以下命令(将 Enterpise 替换为您的安装,例如 Professional、BuildTools、Community):
gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio17\Enterprise\Common7\IDE\Extensions\Microsoft\SQLCommon0\Microsoft.SqlServer.BatchParser.dll"