Не удалось загрузить файл или сборку "Ошибка 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 с помощью 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, поэтому это не может быть проблемой)

так что новый вопрос: как я могу убедиться, что он загружает его из нужного места?

Ответ 1

Причина, по которой исключение вызывается, как только вы вводите метод, прост - компилятор JIT должен только разрешить ссылки. MySqlConnection требует System.Data, и это первый метод для этого, так что при возникновении исключения.

Что касается отладки проблемы, это похоже на неправильно установленную платформу .NET на целевой машине. Вы должны попробовать Как включить ведение журнала сбоев сборки (Fusion) в .NET, чтобы посмотреть, где .NET на самом деле пытается найти библиотеку и почему она отбрасывает любой, что он находит вообще.

Если это не поможет вам решить вашу проблему, попробую удалить и переустановить .NET framework 2.0, а затем 3.5.

Причина копирования экземпляров "Копировать локальный" заключается в том, что тогда приложение не пытается загрузить DLL из глобального сборочного кэша, а скорее из исполняемого каталога вашего приложения. Однако ваша реальная проблема заключается в том, что она не находит нужную DLL в GAC.

Если Fusion показывает вам, что библиотека MySQL пытается загрузить неправильную версию System.Data, вы можете использовать манифест приложения, чтобы заставить его загружать другую версию (которая, надеюсь, будет совместима). Здесь вы можете прочитать о манифестах приложений - http://msdn.microsoft.com/en-us/library/aa374191(VS.85).aspx

Удачи.

Ответ 2

Всякий раз, когда я видел такие проблемы, это потому, что я не развернул правильную версию рассматриваемой библиотеки или потому, что на самом деле я пропускаю библиотеку. Я думаю, что другие уже ссылались на это, но я хотел повторить, чтобы подчеркнуть, что это главная проблема.

Чтобы решить эти проблемы, вы можете сделать две вещи. Во-первых, понять порядок загрузки библиотек:

  • Посмотрите глобальный кэш сборок (GAC)
  • Найдите папку, в которой работает ваша программа из
  • Поиск текущего каталога
  • Поиск в системной папке (System32 или SysWow64)
  • Поиск любых других папок в среде% PATH% variable

Как только вы это поймете, вы можете посмотреть в каждом из этих мест за неправильными или противоречивыми версиями библиотеки, на которую вы ссылаетесь. Поскольку System.Data - это библиотека, которая поставляется с .NET, я бы предположил, что ваш компьютер для сборки имеет другую версию .NET, установленную на вашем компьютере, на котором вы пытаетесь развернуть.

Другая вещь, которую я нашел очень полезной, - это инструмент, называемый fuslogvw.exe(http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx). Если вы следуете инструкциям на сайте FusionLog, вы можете отслеживать .NET, когда он пытается загрузить различные сборки. Просто включите инструмент, затем проверьте файл журналов после получения ошибки. Это должно указывать, где .NET ищет файл и, возможно, почему он не удалось.

Как говорили другие - удачи!

Ответ 3

Чтобы найти файл с расширением .dll, он в конечном счете не смог найти ( "или одну из своих зависимостей" в сообщении об ошибке) и откуда он пытается загрузить его, вы можете попробовать Process Monitor из пакета SysInternals.

Это простая загрузка, распаковка и запуск. Я предлагаю вам добавить фильтр для вашего имени приложения (или что-то еще, что вы можете использовать для его уникальной идентификации), а затем просто понаблюдайте за его попыткой загрузить DLL и провалиться. Вы можете применять больше фильтров для сужения списка событий, таких как Operation is QueryNameInformationFile (первое событие, которое оно пытается при поиске файла). Обратите внимание, что для большого количества DLL файлов он попробует несколько мест, прежде чем в конечном итоге найти копию, поэтому вы ищете серию событий, ссылающихся на одно и то же имя файла без результата результата в конце.

Желаем удачи.

Ответ 4

У меня была эта ошибка, когда обновление Windows устанавливалось .Net 4.5.2, в то же время я отлаживал свой код в 4.5.1.

Ответ 5

У меня была та же проблема,

Сначала вы должны скопировать файл ссылочной DLL в папку bin основного проекта, который его использует, и включить файл в раздел ссылок основного проекта внутри VS.

Во-вторых, если вы используете свой основной проект как проект библиотеки и включаете его в другой проект (второй проект), добавьте тот же ссылочный файл dll в папку bin этого второго проекта, а также включите этот скопированный файл в раздел ссылок второго проекта в VS.

Это обходное решение решило мою проблему, я надеюсь, что это тоже поможет.