【发布时间】: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 而不是任何机器编译,看看是否会改变哪些机器抛出错误?将有助于调试。