问题: 将应用程序部署到生产数据库时,出现以下错误:
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,这样就不会出现问题)
所以新问题:我如何确保从正确的位置加载它?
答案 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)
每当我看到这样的问题时,都是因为我没有部署相关库的正确版本,或者因为我实际上错过了一个库。我认为其他人已经引用了这一点,但我想重复一遍,强调这是主要问题。
为了解决这些问题,你可以做两件事。首先,了解库的加载顺序:
一旦理解了这一点,就可以在每个位置查找您正在引用的库的错误或冲突版本。由于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的第二个项目的参考部分。
这个解决方法解决了我的问题,我希望它也可以帮到你。