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

Vin*_*ent 10 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
Run Code Online (Sandbox Code Playgroud)

我所知道的:实际上并不是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);
        }
Run Code Online (Sandbox Code Playgroud)

我评论了这条线:

MySqlConnection connection = new MySqlConnection(connectionString);
Run Code Online (Sandbox Code Playgroud)

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

编辑

我注意到一件奇怪的事情:当它到达MySqlConnection创建位置的方法(而不是行)时,会抛出错误.如果您查看上面的代码示例,则第一个代码示例Console.WriteLine("initializing strings");甚至不会显示在我的控制台中.我发现这很奇怪,因为你会期望错误被抛出到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,这是结果:

*装配活页夹日志条目(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下运行---下面是详细的错误日志.

===预绑定状态信息=== 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\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,这样就不会出现问题)

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

Lua*_*aan 6

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

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

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

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

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

祝好运.