关于.net:引用Microsoft.SqlServer.Smo的应用程序需要在目标计算机上包含其他程序集吗?

关于.net:引用Microsoft.SqlServer.Smo的应用程序需要在目标计算机上包含其他程序集吗?

App referencing Microsoft.SqlServer.Smo requires additional assemblies to be included on Target Machine?

我有一个小应用程序,它引用了Microsoft.SqlServer.Smo程序集(因此我可以向用户显示它们可以连接到的服务器和数据库的列表)。

我的应用程序最初引用了Microsoft.SqlServer.Smo和Microsoft.SqlServer.ConnectionInfo。事情在我的开发箱中按预期进行。

当我在测试计算机上安装应用程序时,我收到了System.IO.FileNotFoundException。该消息的详细信息包括以下内容:
无法加载文件或程序集Microsoft.SqlServer.SmoEnum

我最终通过引用上述程序集之外的以下程序集解决了该问题:

  • Microsoft.SqlServer.SmoEnum
  • Microsoft.SqlServer.SqlEnum
  • Microsoft.SqlServer.BatchParser
  • Microsoft.SqlServer.Replication

任何人都可以确认我确实确实需要在应用程序中包括所有这些附加程序集(并因此将它们安装在用户的计算机上),即使该应用程序在我的开发箱中构建得很好,也没有引用它们吗?


您需要在目标计算机上安装两个MSI文件,即:

1)SQLSysClrTypes.msi [C#-> SMO GAC需要此)

2)SharedManagementObjects.msi

对于SQL Server 2014,您可以在此处下载。

另外,您必须确保版本正确。稍加搜索即可找到这两个文件。这样,您就不会将任何内容复制到本地,并且GAC会解决这些问题。

我知道这是个老问题,但是答案并不令人满意。


是的,确实需要将它们包括在内。在开发计算机上,您可能已经安装了SQL Server,它将这些程序集放入"全局程序集缓存"中。无论何时构建,Visual Studio都会从GAC中提取它们。它还假定将在其上部署的任何计算机的GAC也将具有这些文件。如果不是,则抛出FileNotFound异常。


对我来说,这个答案不正确。我添加了以上引用,但没有解决方法。最终,我发现我只需要参考:

Microsoft.SqlServer.Smo

...以及以下解决方案:

我在SQL Server复制项目上收到"尝试加载格式不正确的程序"错误

总而言之,我需要启用IIS 6才能在IIS应用程序池上启用32位应用程序。这是因为我安装了Win 7 x64,但是安装了SQL x86。太糟糕了,错误消息不能更具体了吧?


由于JIT在运行时链接到外部程序集,因此如果不分析代码并查看您所调用的内容以及这些调用所调用的内容等,就无法回答此问题。

如果您想自己进行分析,最好的选择是仅引用所需的程序集,然后从异常和内部异常中了解发生了什么。

您应该研究的另一件事是,为什么您提到的四个程序集不在GAC中。看起来确实应该如此。


推荐阅读