引用Microsoft.SqlServer.Smo的应用程序是否需要在目标计算机上包含其他程序集?

时间:2020-03-05 18:57:09  来源:igfitidea点击:

我有一个小应用程序,它引用了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

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

解决方案

回答

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

如果我们想自己分析这个问题,最好的选择是只引用所需的程序集,然后从异常和内部异常中了解发生了什么。

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

回答

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