Ошибка "Не удается загрузить файл или сборку System.Drawing или одну из ее зависимостей" в.Net 2.0, VS2010 и Windows 8

Я получаю исключение FileNotFoundException для проекта приложения Windows Forms со следующим сообщением:

Could not load file or assembly 'System.Drawing, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. 
The system cannot find the file specified.

Чтобы воспроизвести проблему:

  • Выберите New, Project, выберите.Net Framework 2.0 в качестве цели и выберите Windows Forms Application в качестве типа проекта.
  • В свойствах формы, созданной по умолчанию, выберите значение для свойства Icon. Подойдет любой файл.ico. Это вставит файл в файл resx.
  • Скомпилируйте и запустите приложение.

Когда я делаю это, программа останавливается на линии this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); со следующим исключением:

System.IO.FileNotFoundException was unhandled
  Message=Could not load file or assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
  Source=mscorlib
  FileName=System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a

Я получаю это на Visual Studio 2010 SP1, недавно установленной в Windows 8 Developer Preview. Если я изменю свойства проекта на целевой.Net Framework 4, ошибка исчезнет.

В файле Form1.resx я вижу, что версия сборки System.Drawing явно указана как 2.0:

<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Есть идеи?

14 ответов

Решение

Я нашел возможное решение, попробуйте это:

Откройте файл resx в Designer и установите для модификатора доступа значение public, а не генерацию кода.

Изменить: есть обходной путь, но очень раздражает, хотя.

  1. Откройте форму в дизайнере и внесите необходимые изменения в графический интерфейс. Закрыть конструктор и сохранить
  2. Компиляция проекта и получение ошибки компиляции RESX (эта проблема должна возникать только в формах с Imagelist)
  3. Дважды щелкните по ошибке компиляции resx, чтобы открыть файл resx.
  4. Прокрутите к началу imagestream.
  5. Редактировать верхнюю линию потока изображения: AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w К AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
  6. Закройте и сохраните файл resx и перекомпилируйте.

** ПРИМЕЧАНИЕ: единственная разница - символы в конце от "j00LjAuMC4w" до "j0yLjAuMC4w". Это необходимо делать КАЖДЫЙ РАЗ, когда вы открываете форму в режиме конструктора.

Microsoft говорит, что они собираются исправить это в следующей версии VS...

Источник: http://connect.microsoft.com/VisualStudio/feedback/details/532584/error-when-compiling-resx-file-seems-related-to-beta2-bug-5252020

Это ошибка. Я тоже это видел. Это происходит потому, что ваш файл.resx указывает на версию 4.0.0.0 System.Drawing, где он не существует. Чтобы преодолеть эту проблему, я обычно редактирую.resx в блокноте, чтобы изменить 4.0.0.0 на 2.0.0.0. Ошибка вводится, следуя точным шагам, которые вы наметили.

Эта проблема может возникнуть, если для создания файлов ресурсов используется.net 4.5 preview resgen.

У меня такая же проблема на моем ноутбуке (Windows 7, VS2010 Premium, VS11 Developer Preview). Я получил эту проблему с простым проектом форм, когда я говорю "localizable=true" в форме. В моем случае данные изображения не используются. Проект настроен на.net 3.5

private void InitializeComponent()
{
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
    this.SuspendLayout();
    // 
    // Form1
    // 
    resources.ApplyResources(this, "$this"); //exception Could not load file or assembly 'System.Drawing, Version=4.0.0.0, 

Если я затем скопирую этот проект на другую машину (Windows 7, VS2010 Premium) и попробую отладить его, ошибка останется. Ошибка исчезает, если я очищаю решение (не проект)(или удаляю bin/obj вручную). Если я затем копирую это решение обратно на мой ноутбук, ошибка исчезает, но я не могу снова увидеть форму в режиме конструктора 'Error message: at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)'

Причиной всего этого является версия.net в файлах *.Designer.cs.

  1. Runtime Version: 4.0.30319.239 на компьютере, где он работает,
  2. Runtime версия: 4.0.30319.17020 на ноутбуке, где я получаю исключение.

Может кто-нибудь сказать мне, где я могу настроить, какая версия Resgen используется при работе с проектами.net 3.5?

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

Открой свой проект
Перейти в обозреватель решений
Разверните Справочную группу
Удалить ссылку System.Drawing
Щелкните правой кнопкой мыши на ссылку группы
Добавить ссылку
На вкладке ".NET" найдите System.Drawing, чтобы добавить нужную ссылку.

Вот простое решение, которое сработало для меня:

У меня была такая же ошибка. Мой код представляет собой пример пакета EMGU FeatureMatching с использованием VS2017.

Ошибка, похоже, возникает из-за несоответствия между версией System.Drawing.dll и целевой платформой.

Чтобы исправить это, я удалил System.Drawing (щелкните его правой кнопкой мыши в обозревателе решений в разделе "Ссылки"). Затем я нажал "Добавить ссылку" (щелкните правой кнопкой мыши "Ссылки в обозревателе решений") и перешел в эту папку: C:\Windows\Microsoft.NET\Framework\

В нем находятся папки с пометками v1.xxxx, v2.xxxx, v3.xxxx и т. Д. Я открыл папку v4.0.30319 и выбрал в ней файл System.Drawing.dll. Щелкните ОК.

Затем я перешел к установке Target Framework. Перейдите в меню Project>YourApp Properties (внизу меню). Выберите приложение слева. Есть раскрывающийся список для "Целевая платформа". Я выбрал.NET Framework 4". Я получаю страшное сообщение о потере чего-то, о том, что проект будет закрыт и снова открыт. Я нажал кнопку ОК, проект сразу же закрылся и снова открылся.

Я запустил свой проект, и теперь все в порядке.

Я была такая же проблема.

Я восстановил.net 4.5.1, и это исправило это.

У меня была эта проблема, и я обнаружил, что это странно связано с бета-версией.Net 4.5. Удаление и повторная установка.Net 4.0 привели к устранению проблемы. Не уверен, есть ли способ установить бета-версию.Net 4.5 и одновременно использовать ресурсы из проекта.Net 2.0.

Я нашел исправление, установив в запускаемый проект

щелкните правой кнопкой мыши запускаемый проект и нажмите, управляйте пакетами Nuget и устанавливайте system.drawing.common

Я также столкнулся с этой проблемой, и в моем случае причиной было параллельное создание двух по сути дублирующих проектов, один из которых был нацелен на.NET 2.0, а другой - на.NET 4.0, причем оба содержали в основном один и тот же код и ресурсы. Если время выбрано правильно, проект 2.0 получит выходной файл из проекта 4.0 и в конечном итоге будет ссылаться на библиотеки 4.0.

Я исправил это, создавая проекты в серии, заставляя один зависеть от другого.

(Я ценю, что это, вероятно, не было причиной первоначальной проблемы, опубликованной @Leonardo, но это может быть полезно для будущих посетителей, которые столкнутся с этой ошибкой при аналогичной настройке двух проектов.)

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

Но если у вас возникнет эта проблема, вы можете

  • Щелкните правой кнопкой мыши ссылки в обозревателе решений

  • Нажмите Добавить ссылку, выберите тот, который вам не хватает.

  • Очистите и создайте свой проект.

Недавно у меня появилось то же сообщение об ошибке, когда клиент попросил меня отказаться от приложения.

Используя Visual Studio 2010 Professional, я изменил целевой фреймворк с.NET Framework 4 на.NET Framework 3.5. Построение не удалось с указанным сообщением об ошибке. Решение состояло в том, чтобы удалить файл изображения, вызывающий проблему, из ресурсов приложения. Добавив его снова, версия System.Drawing была указана как 2.0.0.0, и сборка прошла успешно.

У меня была та же проблема.. с моим фреймворком 2.0 Project продолжают ссылаться на 4.0 dll. Как я смог это исправить... просто перейдите по ссылке на ваш проект -> выберите "Syste.Drawing" -> Свойства и там выберите использовать точную версию =true

Это заставит использовать 2.0 framework dll.

Надеюсь это поможет.

Ура!!!

Я встречался с той же проблемой в проекте Xamarin

На самом деле это не будет работать в Xamarin, так как это Windows DLL.

Посмотрите на обсуждение,

https://forums.xamarin.com/discussion/14340/adding-a-reference-to-net-assembly

Это не относится к ситуации ОП, но если вы получаете эту ошибку в связи с использованием ResourceWriter класс для преобразования .resx файл в .resources файл, а затем читать дальше. Я столкнулся с этой ошибкой, и единственный способ исправить это - отсканировать данные "System.Drawing, Version=4.0.0.0" и заменить его на "System.Drawing, Version=2.0.0.0", Вот мой код (это часть модификации Roslyn):

  /// <summary>
  /// Method that gets called by ManagedResource.WriteData() in project CodeAnalysis during code 
  /// emitting to get the data for an embedded .resx file. Caller guarantees that the returned
  /// MemoryStream object gets disposed.
  /// </summary>
  /// <param name="resourceFullFilename">full path and filename for .resx file to embed</param>
  /// <param name="targetLessThan4">true if necessary to change System.Drawing from 4.0.0.0 to 2.0.0.0</param>
  /// <returns>MemoryStream containing .resources file data for the .resx file</returns>
  [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
  private static MemoryStream ProvideResourceDataForResx(string resourceFullFilename, 
                                                         bool targetLessThan4)
  {
     MemoryStream shortLivedBackingStream = new MemoryStream();
     using (ResourceWriter resourceWriter = new ResourceWriter(shortLivedBackingStream))
     {
        using (ResXResourceReader resourceReader = new ResXResourceReader(resourceFullFilename))
        {
           IDictionaryEnumerator dictionaryEnumerator = resourceReader.GetEnumerator();
           while (dictionaryEnumerator.MoveNext())
           {
              string resourceKey = dictionaryEnumerator.Key as string;
              if (resourceKey != null)  // Should not be possible
                 resourceWriter.AddResource(resourceKey, dictionaryEnumerator.Value);
           }
        }
     }

     // Get reference to the buffer used by shortLivedBackingStream, which is now closed because
     //  resourceWriter was disposed. If relevant, fix version number for System.Drawing.
     byte[] backingStreamBuffer = shortLivedBackingStream.GetBuffer();
     if (targetLessThan4)
        ChangeSystemDrawingVersionNumber(backingStreamBuffer);

     // Create new MemoryStream because shortLivedBackingStream is closed
     return new MemoryStream(backingStreamBuffer);
  }


  /// <summary>
  /// Method to change the System.Drawing version number from "4.0.0.0" to "2.0.0.0" in the
  /// binary data that represents a .resources file. This implementation is based on the
  /// assumption that character data in the .resources file is in UTF-8 encoding.
  /// </summary>
  private static void ChangeSystemDrawingVersionNumber(byte[] dataBuffer)
  {
     byte[] byteArray1 = Encoding.UTF8.GetBytes("System.Drawing, Version=4.0.0.0");
     byte[] byteArray2 = Encoding.UTF8.GetBytes("System.Drawing, Version=2.0.0.0");

     for (int i = 0; i < dataBuffer.Length - byteArray1.Length; i++)
        if (ArrayEquals(byteArray1, dataBuffer, i))
           Array.Copy(byteArray2, 0, dataBuffer, i, byteArray2.Length);
  }


  /// <summary>
  /// Method to test for a byte array in a larger byte array that is being searched. No error
  /// checking is done - it's assumed an indexing error is not possible.
  /// </summary>
  private static bool ArrayEquals(byte[] searchArray, byte[] searchedArray, 
                                  int searchedArrayIndex)
  {
     for (int i = 0; i < searchArray.Length; i++)
        if (searchArray[i] != searchedArray[searchedArrayIndex + i])
           return false;
     return true;
  }

Изменить: в предыдущей версии этого ответа я использовал ResourceWriter.TypeNameConverter метод. Это работало в некоторых ситуациях, но не в других, и есть сообщение об ошибке, которое указывает, что могут быть проблемы с этим кодом, по крайней мере для соответствующего кода в.Net Core: https://github.com/dotnet/corefx/issues/11083.

Другие вопросы по тегам