在生产数据库上部署应用程序时无法加载文件或程序集’System.Data错误

问题:将我的应用程序部署到生产数据库时,出现以下错误:

Could not load file or assembly 'System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified. at ConsoleApplication2.Database.DBConnect.Initialize(String username, String password, String IP) at ConsoleApplication2.Database.DBConnect..ctor(String username, String password, String IP) in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\DBConnect.cs:line 26 at ConsoleApplication2.Database..ctor() in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\Database.cs:line 20 at ConsoleApplication2.Main..ctor() in C:\Users\Vincent\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\Main.cs:line 16 

我所知道的:实际上并不是System.Data.dll有问题。

自从我开始制作一个干净的控制台应用程序。 首先只使用Console.write()。 什么工作,我做了一个新的类,做了一些一般的计算(也没有问题)比我决定使用MySQL.data.MySqlClient创建一个MySQL连接; 来自Mysql.data.dll,这是再次发生错误。 我从mysql网站获得了dll。

奇怪的是:这个dll一直在我的计算机上(我在其上创建了应用程序)和两个不同的服务器上工作(其中一个我设置的只是为了测试这些应用程序,看看我是否会遇到同样的问题)

一些规格:我的电脑运行Windows 7 32位。 生产数据库运行Windows 2003 Service Pack 2,测试服务器和我尝试过的其他服务器也是如此。

我做过的其他一些事情:我创建了一个安装程序(.msi和.exe),它们都安装.net 3.5 service pack 1和.net 2.0 service pack 2.0和.net 3.0 service pack 2.我觉得很奇怪它会安装所有那些.net框架,但要安装3.5,你需要2.0,这样才有意义(不知道为什么它安装3.0虽然)

我也尝试在没有安装MySQL连接器的情况下运行应用程序(所以只需将mysql.data.dll放在应用程序文件夹中)并且我已经尝试安装了MySQL连接器(因此应用程序文件夹中没有dll)

我已经尝试将我的.net框架复制到生产数据库(这是在我知道它是关于mysql.data.dll而不是system.dll或system.data.dll之前)

我已经尝试了我能想到的一切但没有任何作用,它在所有其他计算机/数据库上运行正常,而不是我们想要部署应用程序的1 …

发生错误的代码:

  public DBConnect(string username, string password, string IP) { Console.WriteLine("dbconnect contsrutctor"); Initialize(username, password, IP); } private void Initialize(string username, string password, string IP) { Console.WriteLine("initializing strings"); string server = IP; string database = ""; string connectionString; connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + username + ";" + "PASSWORD=" + password + ";"; Console.WriteLine("initializing mysqlconnection"); //MySqlConnection connection = new MySqlConnection(connectionString); } 

我评论了这一行:

 MySqlConnection connection = new MySqlConnection(connectionString); 

并且应用程序运行没有错误,当我取消注释时,错误再次发生。

编辑

我注意到一件奇怪的事情:当它到达创建MySqlConnection的方法(不是行)时,会抛出错误。 如果你看一下上面代码示例的第一个Console.WriteLine("initializing strings"); 甚至没有显示在我的控制台中。 我发现这很奇怪,因为你会期望在MySqlConnection connection = new MySqlConnection(connectionString);上抛出错误MySqlConnection connection = new MySqlConnection(connectionString); 行而不是方法的开头。

编辑2我以为我找到了答案所以我发布了它:

“虽然我已经检查了system.data.dll和system.dll版本和文件路径(在所有3台机器上都完全相同,但我确实发现了这些文件的问题。

在我的应用程序中,我将“copy local”设置为true,之后它就可以了。

我发现这非常奇怪,因为我尝试用我自己的生产服务器替换dll,但这不起作用。 也只是将dll放在应用程序文件夹中也没有帮助。 我必须专门指定应用程序来复制它自己的dll。

无论如何它现在正常工作,虽然我不太相信我喜欢这个解决方案……

我绝对不喜欢这个,因为我需要对dll的一半做这个(是的一半不是全部只有一半)。

任何更好的选择仍然是受欢迎的。“

但是我没有提到它在我的测试应用程序上工作,真正的应用程序这次找不到system.transactions。 所以它仍然不是正确的解决方案虽然它确实清除了关于system.data.dll的错误我仍然无法运行该程序,因为不同的文件类似的错误。

所以,因为我仍然有相同的错误,但在一个不同的文件(我不能将“复制本地”设置更改为真,因为它没有被我引用)我已删除答案并将其作为编辑放在这里既然问题仍未解决。

编辑3我运行Fuslogvw.exe,这是结果:

*assembly活页夹日志条目(2013年12月5日上午8:43:13)*

操作失败。 绑定结果:hr = 0x80070002。 该系统找不到指定的文件。

程序集管理器从以下位置加载:C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dll在可执行文件C:\ Program Files \ Custommate \ email sorteer service \ EmailSorteerService.exe下运行—下面是详细的错误日志。

===预绑定状态信息===日志:User = NAVMATE \ Administrator LOG:DisplayName = System,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089(完全指定)LOG:Appbase = file:// / C:/ Program Files / Custommate / email sorteer service / LOG:Initial PrivatePath = NULL LOG:Dynamic Base = NULL LOG:Cache Base = NULL LOG:AppName = NULL调用程序集:EmailSorteerService,Version = 1.0.0.0,Culture = neutral ,PublicKeyToken = null。 ===日志:此绑定在默认加载上下文中启动。 日志:找不到应用程序配置文件。 日志:使用C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ config \ machine.config中的计算机配置文件。 日志:策略后引用:系统,版本= 2.0.0.0,Culture =中性,PublicKeyToken = b77a5c561934e089日志:GAC查找失败。 日志:尝试下载新的URL文件:/// C:/ Program Files / Custommate / email sorteer service / System.DLL。 日志:尝试下载新的URL文件:/// C:/ Program Files / Custommate / email sorteer service / System / System.DLL。 日志:尝试下载新的URL文件:/// C:/ Program Files / Custommate / email sorteer service / System.EXE。 日志:尝试下载新的URL文件:/// C:/ Program Files / Custommate / email sorteer service / System / System.EXE。 日志:尝试所有探测URL并失败。

这意味着它试图从我正在运行应用程序的文件夹中加载dll,我觉得这很奇怪,因为我不知道是什么原因造成的。 (我确保将copy local设置为false,这样就不会出现问题)

所以新问题:我如何确保从正确的地方加载它?

一旦输入方法就抛出exception的原因很简单 – JIT编译器只需要解析引用。 MySqlConnection需要System.Data,这是第一个这样做的方法,所以当抛出exception时。

至于调试问题,它似乎在目标机器上不正确地安装了.NET框架。 您应该尝试如何在.NET中启用程序集绑定失败日志记录(Fusion),以查看.NET实际尝试查找库的位置,以及为什么它会丢弃它找到的任何库。

如果它不能引导您解决问题,我会尝试卸载并重新安装.NET framework 2.0,然后再3.5。

Copy Local sort of works的原因是因为应用程序不会尝试从全局程序集缓存加载DLL,而是从应用程序的可执行目录加载DLL。 但是,您真正的问题是它没有在GAC中找到正确的DLL。

如果Fusion向您显示MySQL库试图加载错误版本的System.Data,您可以使用应用程序清单强制它加载不同的版本(希望它可以兼容)。 你可以在这里阅读有关应用程序清单的信息 – http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx

祝好运。

每当我看到这样的问题时,都是因为我没有部署正确版本的库,或者因为我实际上错过了一个库。 我认为其他人已经引用了这一点,但我想重复一下,强调这是主要问题。

为了解决这些问题,你可以做两件事。 首先,了解库的加载顺序:

  • 查看全局程序集缓存(GAC)
  • 搜索运行程序的文件夹
  • 搜索当前目录
  • 搜索系统文件夹(System32或SysWow64)
  • 搜索环境%PATH%变量中的任何其他文件夹

一旦理解了这一点,就可以在每个位置查找您正在引用的库的错误或冲突版本。 由于System.Data是.NET附带的库,我猜你的构建计算机安装的.NET版本与您尝试部署到的计算机上的版本不同。

我发现其他有用的东西是一个名为fuslogvw.exe的工具( http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx )。 如果按照FusionLog站点上的说明进行操作,则可以在尝试加载各种程序集时跟踪.NET。 只需启用该工具,然后在收到错误后检查日志文件。 这应该表明.NET在寻找文件的位置以及可能失败的原因。

正如其他人所说 – 祝你好运!

要查找哪个.dll最终找不到(错误消息中的“或其中一个依赖项”)以及它尝试加载它的位置,您可以从SysInternals套件中尝试Process Monitor 。

这是一个简单的下载,解压缩和运行。 我建议你为你的应用程序名称添加一个filter(或者你可以用来唯一识别它的其他任何东西),然后只是注意它尝试加载.dll并失败。 您可以应用更多filter来缩小事件列表,例如Operation is QueryNameInformationFile(它在查找文件时尝试的第一个事件)。 请注意,对于很多.dll,它会在最终找到副本之前尝试一些地方,因此您正在寻找引用相同文件名但最后没有成功结果的一系列事件。

祝你好运。

当Windows更新在4.5.1中调试我的代码的同时安装.Net 4.5.2时出现此错误。

我有同样的问题,

首先,您必须将引用dll文件复制到使用它的主项目的bin文件夹中,并将该文件包含在VS内主项目的引用部分。

其次,如果您将主项目用作库项目并将其包含在另一个项目(第二个项目)中,则将相同的引用dll文件添加到第二个项目的bin文件夹中,并将此复制文件包含在VS的第二个项目

这个解决方法解决了我的问题,我希望它也能帮到你。