Проблема: При развертывании моих приложений в производственной базе данных я получаю следующую ошибку:
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 с помощью MySQL.data.MySqlClient; из файла Mysql.data.dll это когда ошибка снова возникла. Я получил dll из сайта mysql.
странная часть: эта dll всегда работала на моем компьютере (на котором я создал приложения) и на двух разных серверах (1 из которых я настроил только для тестирования этих приложений, чтобы увидеть, получится ли у меня такая же проблема)
некоторые спецификации: мой компьютер запускает Windows 7 32 бит. производственная база данных запускает пакет обновления 2 для Windows 2003, как и тестовый сервер, и другой сервер, на котором я его пробовал.
Некоторые другие вещи, которые я сделал: Я создал установщик (.msi и .exe) и установил .net 3.5 пакет обновления 1 и .net 2.0 Service Pack 2.0 и .net 3.0 с пакетом обновления 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);
, а не в начале метода.
РЕДАКТИРОВАТЬ 2 Я думал, что нашел ответ, поэтому я разместил его:
"Хотя я проверил версии system.data.dll и system.dll и файловые пути (которые были точно такими же на всех трех машинах, которые я нашел проблема с этими файлами.
В моем приложении я установил" copy local" в true и после этого работал.
Я считаю это чрезвычайно странным, так как я пытался заменить DLL на производственный сервер с моим собственным, и это не сработало. также просто размещение DLL в папке приложения тоже не помогла. Мне пришлось специально указать приложение для копирования dll it self.
В любом случае, он работает правильно, хотя я не совсем уверен, что я как это решение...
Мне определенно не нравится это, потому что мне нужно сделать это до половины dll (да половина не всех примерно половины из них).
любые лучшие варианты по-прежнему приветствуются.
Однако я не упомянул, что он работал над моим тестовым приложением, и на данный момент реальное приложение не может найти system.transactions. так что это еще не правильное решение, хотя оно и устранило ошибку в файле system.data.dll. Я все еще не могу запустить программу из-за аналогичной ошибки для другого файла.
Так как я все еще имею ту же ошибку, но в другом файле (который я не могу изменить параметр "copy local" на true, поскольку он не ссылается на меня), я удалил ответ и поместил его здесь как редактирование, так как проблема все еще не решена.
РЕДАКТИРОВАТЬ 3 Я запустил Fuslogvw.exe, и это результат:
* Запись в сборку Binder Log (12/5/2013 @8:43:13 AM) *
Не удалось выполнить операцию. Результат привязки: 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 = файл:///C:/Program Files/Custommate/email sorteer service/LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Кэш-база = NULL LOG: AppName = NULL Вызов сборки: EmailSorteerService, Версия = 1.0.0.0, Культура = нейтраль, PublicKeyToken = null. === LOG: Это связывание начинается с контекста нагрузки по умолчанию. LOG: Файл конфигурации приложения не найден. LOG: использование файла конфигурации машины из C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Config\machine.config. LOG: Послеполитическая ссылка: System, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089 LOG: Поиск в GAC не увенчался успехом. ЖУРНАЛ: Попытка загрузки нового URL-адреса Файл:///C:/Program Файлы /Custommate/email sorteer service/System.DLL. LOG: Попытка загрузка нового URL-адреса file:///C:/Program Files/Custommate/email sorteer сервис /System/System.dll. LOG: попытка загрузки нового URL-адреса file:///C:/Program Files/Custommate/email sorteer service/System.EXE. LOG: попытка загрузки нового URL-адреса file:///C:/Program Files/Custommate/email sorteer service/System/System.EXE. LOG: Все пробные URL-адреса пытались и не выполнялись.
Смысл это, пытаясь загрузить DLL из папки, из которой я запускаю приложение, я нахожу это странным, так как я не знаю, что вызывает это. (Я убедился, что для копирования local установлено значение false, поэтому это не может быть проблемой)
так что новый вопрос: как я могу убедиться, что он загружает его из нужного места?