Ошибка «Не удается загрузить файл или сборку System.Drawing или одну из ее зависимостей» в .Net 2.0, VS2010 и Windows 8 - PullRequest
16 голосов
/ 08 февраля 2012

Я получаю исключение 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.

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

  • ВыберитеНовый, 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" />

Есть идеи?

Ответы [ 12 ]

9 голосов
/ 08 февраля 2012

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

5 голосов
/ 09 февраля 2012

Эта проблема может возникнуть, если для создания файлов ресурсов используется .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 Version: 4.0.30319.17020 на ноутбуке, гдея получаю исключение.

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

4 голосов
/ 08 февраля 2012

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

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

Редактировать: есть обходной путь, но очень раздражает.

  1. Откройте форму в Designer и внесите необходимые изменения в GUI.Закройте конструктор и сохраните
  2. Скомпилируйте проект и получите ошибку компиляции RESX (эта проблема должна возникать только у форм с Imagelist)
  3. Дважды щелкните по ошибке компиляции resx, чтобы открыть файл resx.

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

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

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

1 голос
/ 21 октября 2014

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

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

1 голос
/ 04 апреля 2012

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

0 голосов
/ 26 июня 2019

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

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

Ошибка возникает из-за несоответствия между версией System.Drawing.dll и Target Framework.

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

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

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

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

0 голосов
/ 04 июня 2018

Это не относится к ситуации ОП, но если вы получаете эту ошибку в связи с использованием класса 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.

0 голосов
/ 04 марта 2016

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

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

Взгляните на обсуждение,

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

0 голосов
/ 10 июня 2015

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

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

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

0 голосов
/ 13 апреля 2015

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

Это заставит использовать 2.0 Framework DLL.

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

Ура !!!

...