Общая ошибка GDI + на одной машине, но не на другой - PullRequest
2 голосов
/ 02 декабря 2011

Я получаю общую ошибку GDI + при попытке сохранить растровое изображение в MemoryStream с параметром ImageFormat.

Странно то, что это происходит только на одном из моих компьютеров, но не на других.Единственное отличие, которое я заметил, состоит в том, что компьютеру, получающему исключение, также необходимо следующее в файле App.config:

<startup useLegacyV2RuntimeActivationPolicy="true">
   <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

Без этого он не может запустить приложение (которое является просто управляемымСлужба Windows).Насколько я могу судить, оба компьютера имеют одинаковую версию .NET, хотя, возможно, я проверяю неправильно.Что может быть причиной этого?

edit: Я не включил код, потому что был почти уверен, что это вызвано чем-то другим.В любом случае, вот фрагмент, где генерируется исключение:

MemoryStream stream = new MemoryStream();
Image image = Image.FromStream(new MemoryStream(File.ReadAllBytes(fullpath))); //JPG
image.Save(stream, image.RawFormat); //works fine
//image.Save(stream, ImageFormat.Png); //throws generic GDI+ error

Я должен также упомянуть, что машина, которая получает исключение, работает под управлением 32-битной Vista, в то время как другие, которые не работают под управлением 64-битнойWindows 7. Каждая машина компилирует само приложение перед его запуском.

Самое главное, все компьютеры имеют useLegacyV2RuntimeActivationPolicy="true" в своих файлах App.config, хотя только тот, который получает ошибку GDI +, является тем, который в ней абсолютно нуждается..

Кроме того, вот версии .NET, которые я установил на обе машины:

Может работать с 64-битной Windows 7: 1.0.3705, 1.1.4322, 2.0.50727, 3.0, 3.5, 4.0.30319, Framework64: 2.0.50727, 3.0, 3.5, 4.0.30319

Получает ошибку при использовании 32-разрядной Vista: 1.0.3705, 1.1.4322, 2.0.50727, 3.0, 3.5, 4.0.30319

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

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

Я предполагаю, что компьютер, который не получает исключения - давайте назовемна компьютере A установлены .NET 2.0, 3.0 и / или 3.5 (и, возможно, также .NET 4.0; здесь это не имеет значения).И я также предполагаю, что сборка, которая получает исключение, была скомпилирована для .NET 3.5 (или 3.0 или 2.0).

Я также предполагаю, что компьютер, который получает исключение - давайте назовем егокомпьютер B - не установлен .NET 3.5, но имеет .NET 4.0.(Это единственная причина, по которой я знаю, что для этого потребуются опубликованные вами записи app.config.)

Позвольте мне еще больше рискнуть предположением о том, что обе машины работают с одной и той же ОС и одинаковой разрядностью ОС.(обе 32-битные ОС или обе 64-битные ОС).Я выхожу здесь на конечность, но я бы надеялся , что если бы они были другими, вы бы включили такого рода важные детали, задавая свой вопрос.

Если бы все этидогадки верны, тогда очевидный вывод заключается в том, что .NET изменил свое поведение между версией 2.0 .NET (которая используется на компьютере A, потому что .NET 2.0, 3.0 и 3.5 все работают во время исполнения 2.0) и 4.0.NET runtime (именно это используется на компьютере B, потому что вы специально запросили его в своем app.config)..NET 4.0 выдает исключение, когда вы пытаетесь делать то, что вы делаете, а .NET 3.5 этого не делает.

Очевидный следующий вопрос - «почему он выдает исключение?», Но вы этого не сделали.дал нам где-нибудь около достаточно информации, чтобы попытаться догадаться об этом.

1 голос
/ 03 декабря 2011

В Windows Vista GDI + использовал свои собственные кодеки изображений.В Windows 7 GDI + использует WIC .Это, вероятно, причина различий в поведении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...