我在下面回答实际问题。但首先,我看到你提出的解决方案和你的目标之间存在一个潜在的未实现的问题。即,绑定重定向不是有条件的。所以,如果它找不到版本为 11.0.0.0,它将崩溃而不是回退到 10.0.0.0。因此,只有在安装 SMO 2012 时才需要修改 app.config。如果这是你想要的,忽略本段其余部分。一个可能更简单的解决方案是仅安装你决定使你的应用程序依赖的 SMO 版本。它作为 SQL Server 的单独安装可用,并且你可以同时安装 10.0.0.0 和 11.0.0.0。下载页面:
2012、
2008 R2、
2008。你将需要 SQLSysClrTypes.msi 和 SharedManagementObjects.msi。
现在来看实际问题:
我唯一找到的官方资料是
SMO中的向后兼容性。对于你所讨论的内容,它看起来很好,但是当你开始查看文档的先前版本时,情况就不同了。也就是说,自 SQL2008 版本以来,它似乎没有太大改变。
根据这个:
使用 SQL Server 2012 中的 SMO 可以重新编译使用先前版本的 SQL Server 编写的 SMO 应用程序。
更新:发布后,我决定尝试另一个之前未以这种方式使用过的项目。它有问题,因为它还引用了
SmoExtended
。在这种情况下,至少一个类型
DeviceType
被移动到了
Smo
和
SmoExtended
组件之间。但是,该类型仍在同一个命名空间中。这是一个破坏性变化的例子,只需要重新编译即可使用新版本。简而言之,如果您不使用任何
Smo*Extended
组件,则更有可能成功地重定向组件。
如果只需要重新编译,那么程序集重定向有很大的可能性可以工作(这并不意味着行为没有变化)。我能想到的唯一情况是当类型在程序集之间移动时。特别是如果相同的命名空间在两个程序集中都定义了。
由于微软没有更详细的更改列表,因此您可以使用反射来迭代程序集的成员,以了解确切的差异,如果您真的对此非常好奇。您还可以翻阅msdn上的
documentation版本,以查看是否发现了新的类/方法。但是,反射将更好地告诉您所有的差异。由于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>
我在生产环境中使用了这样的重定向,没有出现问题。但是可能会因人而异。目前我们正在开发链接SMO 2012的机器,但是创建我们的构建机器链接SMO 2008,这意味着如果我们使用新的2012功能(尚未发生),我们的构建机器将会出现问题。这有点冒险,因为我们可以在本地测试并获得与发布版本不同的结果(但幸运的是我们有一个与发布版本一起工作的QA部门,但是在这里我们从未遇到过问题)。实际上,更常见的情况是我使用上述相反的方法。我会在我的机器上编译一个程序集,并希望将其部署到不支持SMO 2012的客户端。
简而言之,你很有可能成功,但是你要自行承担风险。