在一台机器上有通用的GDI+错误,但在另一台机器上没有

本文关键字:机器 一台 GDI+ 错误 | 更新日期: 2023-09-27 18:16:18

当试图将位图保存到带有ImageFormat参数的MemoryStream时,我得到了一个通用的GDI+错误。

奇怪的是,这只发生在我的一台电脑上,而不是其他的。我注意到的唯一区别是,获得异常的计算机还需要在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。每台机器在运行应用程序之前都要自己编译。

最重要的是,所有的机器在他们的App.config文件中都有useLegacyV2RuntimeActivationPolicy="true",尽管只有得到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

在一台机器上有通用的GDI+错误,但在另一台机器上没有

你没有给我们太多线索,但我要用我的通灵调试能力。

我猜没有得到异常的计算机——让我们称之为计算机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运行时(这是在计算机B上使用的,因为你在app.config中特别要求它)之间改变了它的行为。net 4.0抛出异常当你试图做任何你正在做的事情时,而。net 3.5没有。

下一个明显的问题是"为什么它抛出一个异常?",但是你没有给我们任何接近的地方足够的信息来尝试猜测。

在Windows Vista中,GDI+使用自己的图像编解码器。在Windows 7中,GDI+使用WIC。这可能是导致行为差异的原因。