Beim Speichern von Bitmap in MemoryStream ist in GDI + ein allgemeiner Fehler aufgetreten

10

Ich habe Code, der perfekt auf mehreren Maschinen funktioniert (Entwicklung, QA, UAT). Leider, bei der Produktion bekomme ich "Ein generischer Fehler aufgetreten in GDI +" auf der bmp.Save(ms, ImageFormat.Png); Als Ergebnis nehme ich an, dass Sie nicht in der Lage sein werden, das Problem zu reproduzieren, aber vielleicht kann jemand meinen Fehler erkennen. p>

Ein paar Anmerkungen, ich habe viel nach gemeinsamen Lösungen gesucht, beachten Sie, dass dies in MemoryStream gespeichert wird, so dass die Dateiberechtigungs-Probleme die meisten Leute vorschlagen, nicht zutreffen, noch ist das "bmp während des Öffnens gesperrt" Lösung, weil ich wieder woanders schreibe. Schließlich ist es nicht, weil png einen suchbaren Stream benötigt, weil MemoryStream suchbar ist.

Beachten Sie, wenn ich es in ImageFormat.Jpeg ändere, funktioniert es gut. Ich habe nur ein Problem mit PNGs. Ich habe erwähnt, dass der Registrierungsschlüssel HKEY_CLASSES_ROOT\CLSID\{FAE3D380-FEA4-4623-8C75-C6B61110B681} möglicherweise aufgrund von Berechtigungen das Problem darstellt. Als Ergebnis habe ich den Schlüssel so eingestellt, dass Everyone Lesezugriff auf diesen Schlüssel hat, keine Änderung.

%Vor%

Hier ist der vollständige Stack-Trace:

  

[ExternalException (0 x 80004005): ein allgemeiner Fehler trat bei GDI + auf.]
  System.Drawing.Image.Save (Stream-Stream, ImageCodecInfo-Encoder,   EncoderParameters encoderParams) +616457
  WP.Tools.Img.GenerateImage (Zeichenfolge   Text) +383

Hinweis: meine Frage zählt bereits die Lösungen in dem vorgeschlagenen Duplikat. Keine sind das Problem. Wenn es so wäre, würde es auch für JPEG fehlschlagen.

    
dman2306 06.12.2015, 18:23
quelle

1 Antwort

5

Der .NET-Referenzquellcode hier , in der Save-to-Stream-Fall, erhält einen Statuswert von einem Aufruf an die native Methode GdipSaveImageToStream:

%Vor%

Dieser Statuswert ist der einzige API-Rückgabewert, der zum Auslösen einer Ausnahme von dieser Methode verwendet wird. Wenn wir uns die StatusException-Funktion näher ansehen, die basierend auf dem Statuscode entscheidet, welche Art von Ausnahme ausgelöst werden soll, finden wir nur einen einzigen möglichen Statuswert, der zu der externen Exception führt (aus Gdiplus.cs, Zeile 3167):

%Vor%

0x80004005 ist "unspezifizierter Fehler" und der SR.GdiplusGenericError ist der Text "Ein generischer Fehler ist in GDI + aufgetreten." du hast. Dies schließt mehrere andere Möglichkeiten aus, die wir vermuten könnten (was zu verschiedenen Ausnahmen führen würde), nämlich:

  • nicht genügend Speicher
  • Objekt beschäftigt
  • unzureichender Puffer
  • win32error
  • Wertüberlauf
  • unbekanntes Bildformat
  • Eigenschaft nicht gefunden / nicht unterstützt
  • unsupportedgdiplusversion

Die native Methode befindet sich in gdiplus.dll . Kurz gesagt, lassen Sie Ihren Produktionsserver reparieren, reparieren Sie .NET Framework. Weitere Details:

  1. Vergleichen Sie die Versionen dieser DLL in% windir% \ system32 zwischen bekannten Maschinen und der Produktionsmaschine. Die DLL hat Hunderte von Abhängigkeiten, also selbst wenn die Version der Datei selbst übereinstimmt, sehen Sie nach, um Ihr Betriebssystem zu patchen.
  2. Der integrierte Codec für das PNG-Format ist Teil der WIC-Komponente von Windows und befindet sich in WindowsCodecs.dll und WindowsCodecsExt.dll - überprüfen Sie deren Versionen Bibliotheken ebenso. Der Registrierungsschlüssel, den Sie erwähnten, sollte auch auf WindowsCodecsExt.dll verweisen.
  3. nicht auf Recherche basieren, nur Ideen: Zugriff auf den Produktionsserver durch Virtualisierung / Remote-Desktop-Verbindung? Versuchen Sie eine Konsolensitzung, wenn Sie können. Versuchen Sie unterschiedliche Bildschirmauflösungen und Farbtiefen. Probieren Sie Debug / Release-Builds aus. Stellen Sie sicher, dass Sie die DEBUG-Überprüfung in Ihrer Release-Build-Konfiguration tatsächlich deaktiviert haben. Versuchen Sie Builds x64 und MSIL. Wenn Sie NGEN in der Produktion verwenden, versuchen Sie ohne.
dlatikay 09.01.2016 20:43
quelle

Tags und Links