【问题标题】:Generic GDI+ error on one machine, but not the other一台机器上的通用 GDI+ 错误,但另一台机器上没有
【发布时间】:2011-12-01 22:33:20
【问题描述】:

我在尝试使用 ImageFormat 参数将位图保存到 MemoryStream 时遇到一般 GDI+ 错误。

奇怪的是,这只会发生在我的一台计算机上,而不会发生在其他计算机上。我注意到的唯一区别是获得异常的计算机还需要 App.config 文件中的以下内容:

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

没有它,它就无法启动应用程序(它只是一个托管 Windows 服务)。据我所知,两台计算机都具有相同的 .NET 版本,尽管我可能没有正确检查。这可能是什么原因造成的?

编辑:我没有包含代码,因为我几乎可以肯定这是由其他原因引起的。无论哪种方式,这里都是抛出异常的 sn-p:

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

【问题讨论】:

  • @Hans :这不是我要问的。请仔细阅读问题,谢谢!
  • 程序集是用哪个版本的 .NET 编译的?每台机器上安装了哪些版本的 .NET?
  • @Joe :目标框架在 VS2010 中设置为“.NET Framework 4”。所有机器还安装了相同版本的 .NET,即 v4.0.30319。不过,只有获得异常的机器需要 App.config 中的“useLegacyV2RuntimeActivationPolicy”。我想如果我让它在没有那个设置的情况下运行,我可能会解决这个问题。
  • @rafale 首先,我建议您阅读这篇文章和 Rick Strahl 的帖子:stackoverflow.com/questions/2178298/…,其次,通用 GDI 错误是一个如此大的话题,您至少应该发布堆栈跟踪,因为在net,第三,你需要提供一个能重现问题的裸骨样本,如果你能做到,那么至少如果我们不能帮助你,微软 PSS 将能够查看它,使其低于 10 行。
  • 你能尝试只为 x86 而不是任何机器编译,看看是否会改变哪些机器抛出错误?将有助于调试。

标签: c# .net exception gdi+


【解决方案1】:

你并没有给我们太多帮助,但我会使用我的心灵调试能力。

我猜测没有出现异常的计算机——我们称之为计算机 A——安装了 .NET 2.0、3.0 和/或 3.5(可能还安装了 .NET 4.0;那没有) t在这里真的很重要)。而且我还猜测获得异常的程序集是为 .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 则不会。

下一个明显的问题是“为什么它会抛出异常?”,但您没有在任何地方附近向我们提供足够的信息来尝试猜测。

【讨论】:

  • 我在原始帖子中添加了更多细节,包括代码 sn-p。很抱歉之前没有包括在内。
【解决方案2】:

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

【讨论】:

  • 有趣的地方。我会再做一些测试,看看是否确实如此。
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2016-02-19
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多