缺少 Microsoft.Data.Tools.Schema.Sql.UnitTesting。再次

Missing Microsoft.Data.Tools.Schema.Sql.UnitTesting. Again

这个 bug 很老了,但 MS 到目前为止还没有修复它。

我有一个 VS2015 解决方案(很多项目,主要 ASP.NET 一个),我在 VS 2017 中打开它。

这是我在尝试构建它时看到的内容:

所以,我想,好吧,一些引用坏了,我进入项目引用,删除了那两个(...Sql.UnitTesting 和...Tools.Components),并尝试添加它们背部。我看到了什么?当然是这个:

版本错误,它的 15.1.0.0 而不是之前的 15.0.0.0(对于两个 DLL)。大不了,你说,但它仍然没有编译:

它告诉我版本不匹配,我必须在 web.config 文件中创建一些 assembly-bindings。 我所做的,首先是手动操作,然后按照警告中的 double-click 进行操作,正如它所建议的那样。 没有任何变化。我仍然无法构建我的项目。

以前的 SO 问题 (Automatic reference to Microsoft.Data.Tools.Schema.Sql.UnitTesting, Where is the Microsoft.VisualStudio.TestTools.UnitTesting namespace on VS2010?) 没有多大帮助,我无法删除 SSDT 组件,因为它完全中断了 web-project 的加载。我的项目 不是 任何类型的 SQL 测试项目。它只是一个普通的 ASP.NET 4 网络应用程序。

我该怎么做才能解决这个问题?

我搜索了项目的文件并找到了这个:

<Import Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' == ''" />

然后我在 PC 上搜索 Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets,我发现了一些有趣的结果(可点击):

所以,我以前的工作室 VS2015 有 v14 版本的文件,引用的也是 14 版本,这很好。

但根据文件内容,新的 VS2017 引用了 15.0.0.0

但是应该包含这些文件的实际文件夹有 15.1.0.0 版本!我的 web.config 文件中的绑定重定向由于某种原因不起作用。

我从这里看到两个解决方案,更改 Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets 文件,使其包含 15.1.0.0 版本,或将 15.1.0.0 替换为 15.0.0.0 版本。我现在和前者一起去。即将更新。

更新

还是没有用。不,没有构建错误,但项目构建失败。

我还尝试从项目文件中删除那两行 XML,有点奏效了。不太确定,因为它现在表现得更奇怪了。

它在 somemethod(out Ticket ticket);(新的 C#7 功能)的一行上给了我一个奇怪的 "missing ','" 错误,这很好并且没有任何错误,错误本身 disappeared 在我看到它 1 秒后,但是当我将它切换回 C#6 方式时,它最终构建起来没有问题。我现在会尝试 运行 这个项目。

更新

是的,正如我所想,亲爱的微软。现在它给了我这个:

因此,我还需要进行一些更改才能完成将一个简单的 Web 应用程序从 vs2015 手动升级到 vs2017。

在您的测试项目文件中,删除此代码:

<Import Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(SQLDBExtensionsRefPath)' == ''" />
<PropertyGroup>
    <SsdtUnitTestVersion>2.0</SsdtUnitTestVersion>
</PropertyGroup>

并将其替换为:

<ItemGroup Condition="$(VisualStudioVersion) == '15.0'">
    <Reference Include="Microsoft.Data.Tools.Schema.Sql, Version=13.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>$(SSDTPath)\Microsoft.Data.Tools.Schema.Sql.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Data.Tools.Schema.Sql.UnitTesting, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>$(SSDTUnitTestPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.dll</HintPath>
      <Private>True</Private>
    </Reference>
    <Reference Include="Microsoft.Data.Tools.Schema.Sql.UnitTestingAdapter, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
      <HintPath>$(SSDTUnitTestPath)\Microsoft.Data.Tools.Schema.Sql.UnitTestingAdapter.dll</HintPath>
      <Private>True</Private>
    </Reference>
  </ItemGroup>
<PropertyGroup>
    <SsdtUnitTestVersion>3.1</SsdtUnitTestVersion>
  </PropertyGroup>
 <Import Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="$(VisualStudioVersion) != '15.0' And '$(SQLDBExtensionsRefPath)' != ''" />
  <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="$(VisualStudioVersion) != '15.0' And '$(SQLDBExtensionsRefPath)' == ''" />

这是根据官方 Microsoft 开发社区帮助线程 here

虽然对我来说没用。必须在 ssdt 版本周围添加 propertygroup 标签。您可能希望根据您的项目配置保留或删除它。

Select 否,身份和路径应自动解析。