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

时间:2013-11-26 08:05:20

标签: c# mysql dll

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

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,这是再次发生错误。我从the mysql site获得了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&# 39; s在应用程序文件夹中)

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

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

发生错误的代码:

        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);行,而不是在方法的开头。

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

  

"虽然我已经检查了system.data.dll和system.dll版本和   文件路径(在我找到的所有3台机器上完全相同   与这些文件有关的问题。

     

在我的申请表中,我已经设置了#34;复制本地"真的,在此之后   工作

     

我发现这非常奇怪,因为我已经尝试更换了dll上的dll   我自己的生产服务器,这不起作用。也只是放置   应用程序文件夹中的dll也没有帮助。我不得不   具体指定应用程序来复制dll自己。

     

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

     

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

     

仍然欢迎任何更好的选择。"

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

因为我仍然有相同的错误,但是在不同的文件上(我无法更改"将本地"设置为true,因为它未被引用我已经删除了答案并将其作为编辑放在这里,因为问题仍然没有解决。

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

  

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

     

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

     

装配管理器从以下位置加载:   C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorwks.dll正在运行   在可执行文件C:\ Program Files \ Custommate \ email sorteer下   服务\ EmailSorteerService.exe   ---详细的错误日志如下。

     

===预绑定状态信息=== LOG: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 \框架\ V2.0.50727 \ CONFIG \ machine.config中。   日志:政策后参考:系统,版本= 2.0.0.0,文化=中立,   PublicKeyToken = b77a5c561934e089日志:GAC查询失败。日志:   试图下载新的URL   文件:/// C:/程序   文件/ Custommate / email sorteer service / System.DLL。日志:正在尝试   下载新的URL   file:/// C:/ Program Files / Custommate / email sorteer   服务/系统/ system.dll中。日志:尝试下载新网址   file:/// C:/ Program Files / Custommate / email sorteer service / System.EXE。   日志:尝试下载新网址   file:/// C:/ Program Files / Custommate / email sorteer service / System / System.EXE。日志:全部   尝试探测URL并失败。

意味着它试图从我运行应用程序的文件夹中加载dll,我发现这很奇怪,因为我不知道是什么导致了这个。 (我确保将本地副本设置为false,这样就不会出现问题)

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

4 个答案:

答案 0 :(得分:6)

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

至于调试问题,它似乎在目标机器上未正确安装.NET框架。您应该尝试How to enable assembly bind failure logging (Fusion) in .NET来查看.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

祝你好运。

答案 1 :(得分:2)

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

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

  • 查看全局程序集缓存(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在寻找文件的位置以及可能失败的原因。

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

答案 2 :(得分:1)

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

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

祝你好运。

答案 3 :(得分:0)

我遇到了同样的问题,

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

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

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