尝试使用ImageFormat参数将Bitmap保存到MemoryStream时,我收到了一般GDI +错误。
奇怪的是,这只发生在我的一台计算机上,而不是其他计算机上。我注意到的唯一区别是获得异常的计算机在App.config文件中也需要以下内容:
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
如果没有这个,它就无法启动应用程序(它只是一个托管Windows服务)。据我所知,两台计算机都有相同的.NET版本,但我可能没有正确检查。可能导致这种情况的原因是什么?
编辑:我没有包含代码,因为我几乎可以肯定这是由其他原因引起的。无论哪种方式,这里都是抛出异常的片段:
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
答案 0 :(得分:5)
你并没有给我们太多的帮助,但我将使用我的通灵调试能力。
我猜测没有得到例外的计算机 - 让我们称之为计算机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则不会。
显而易见的下一个问题是“它为什么会抛出异常?”,但是你没有给我们任何 near 足够的信息来试图猜测它。
答案 1 :(得分:1)
在Windows Vista中,GDI +使用自己的图像编解码器。在Windows 7中,GDI +使用WIC。这可能是行为差异的原因。