4

关于 SQL Server 2012 SMO 1. 与 v10.0.0.0 (2008) 相比,v11.0.0.0 (2012) 添加了哪些类型/方法/属性?2. 是否应该使用 app.config 设置程序集绑定重定向以允许没有 SQL Server 2008 的用户同时保持与 2008 的兼容性?

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <dependentAssembly>
        <assemblyIdentity name="Microsoft.SqlServer.Smo"
                          publicKeyToken="89845dcd8080cc91"
                          culture="neutral" />
        <bindingRedirect oldVersion="10.0.0.0"
                         newVersion="11.0.0.0"/>
     </dependentAssembly>
  </assemblyBinding>

4

1 回答 1

4

我在下面回答实际问题。但首先,我发现您的既定目标和您提出的解决方案之间可能存在未实现的问题。也就是说,绑定重定向不是有条件的。因此,如果它找不到版本11.0.0.0,它将崩溃而不是重新使用10.0.0.0. 因此,您只需在安装 SMO 2012 时修改 app.config。如果这是您的意图,请忽略本段的其余部分。一个可能更简单的解决方案是简单地安装您决定让您的应用程序依赖的 SMO 版本。它可作为 SQL Server 的单独安装提供,您可以同时安装10.0.0.011.0.0.0安装。下载页面2012、2008 R2、2008。_ 您将需要并且SQLSysClrTypes.msiSharedManagementObjects.msi

现在关于实际问题:

我能找到的唯一官方信息是SMO 中的向后兼容性。在您开始查看文档的先前版本之前,它看起来很适合您正在讨论的内容。即,从 SQL2008 版本开始,它看起来相对没有变化。

据此

可以使用 SQL Server 2012 中的 SMO 重新编译使用以前版本的 SQL Server 编写的 SMO 应用程序。

更新:发布后,我决定尝试使用另一个以前没有以这种方式使用过的项目。它有问题,因为它还引用了在这种情况下SmoExtended.至少有一种类型在和程序集之间移动。但是,该类型仍保留在同一命名空间中。这是一个重大更改的示例,其中只需重新编译即可使用新版本。简而言之,如果您不使用任何程序集,您更有可能成功重定向程序集。DeviceTypeSmoSmoExtendedSmo*Extended

如果只需要重新编译。然后,是的,然后程序集重定向一个很好的工作机会(因为应用程序将运行,这并没有说明任何关于破坏行为的改变)。我能想到不会出现这种情况的主要时间是在程序集之间移动类型时。特别是如果在两个程序集中定义了相同的命名空间。

由于似乎没有来自 Microsoft 的更详细的更改列表,您可以使用反射来迭代您对确切差异非常好奇的程序集的成员。您还可以翻阅 msdn 上的文档版本,看看是否发现了新的类/方法。但是反思会更好地告诉你所有的差异。由于 MS 确实增加了版本,因此在某处进行了一些重大更改和/或添加了新的类/方法。因此,您将需要测试这两种方法以查看它是否在运行时实际工作。

如果您尝试重定向注意,您将需要重定向您引用的所有 SMO 程序集,而不仅仅是主要的。这至少意味着:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Smo"
                        publicKeyToken="89845dcd8080cc91"
                        culture="neutral" />
      <bindingRedirect oldVersion="10.0.0.0"
                       newVersion="11.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Management.Sdk.Sfc"
                        publicKeyToken="89845dcd8080cc91"
                        culture="neutral" />
      <bindingRedirect oldVersion="10.0.0.0"
                       newVersion="11.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.ConnectionInfo"
                        publicKeyToken="89845dcd8080cc91"
                        culture="neutral" />
      <bindingRedirect oldVersion="10.0.0.0"
                       newVersion="11.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

我在生产中有这样的重定向并且没有问题。虽然是 YMMV。目前,我们在我们的机器上开发链接 SMO 2012,但创建我们的构建机器链接 SMO 2008,这意味着如果我们使用 2012 年的新东西(尚未发生),我们的构建机器将会失败。有点冒险,因为我们可以在本地测试并获得与发布版本不同的结果(但幸运的是,我们有一个 QA 部门与发布版本一起工作,但在这里我们从未遇到过问题。)实际上,我更经常使用上面的倒数。我将在我的机器上编译一个程序集,并希望将它部署到不支持 SMO 2012 的客户端。

简而言之,您很有可能会取得成功,尽管这样做需要您自担风险。

于 2012-12-05T16:10:57.850 回答