【问题标题】:Breaking Change on Windows 8 for .NET development?用于 .NET 开发的 Windows 8 上的重大变化?
【发布时间】:2012-08-27 21:44:57
【问题描述】:

我不确定我是否做错了什么,但是当我在 .NET 框架中使用一些最简单的功能时,我发现 Windows 8 发生了重大变化。我的一台机器是带有 Visual Studio 2010 高级版的 Windows 7 X64,另一台是带有完全相同的 Visual Studio 的 Windows 8 X64。 Win7 / Win8 系统都是作为 MSDN 订阅者下载的,所以它们都是官方的。但是对于以下代码:

static void Main(string[] args)
{
    byte[] dataBytes = new byte[256 * 256 * 4 + 256];
    MemoryStream resultStream = new MemoryStream();
    DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress);
    deflateStream.Write(dataBytes, 0, dataBytes.Length);
    Console.WriteLine(resultStream.Length);//2330

    Bitmap a = new Bitmap(256, 256);
    MemoryStream memoryStream1 = new MemoryStream();
    a.Save(memoryStream1, ImageFormat.Png);
    byte[] byteArray1 = memoryStream1.ToArray();
    Console.WriteLine(byteArray1.Length);//1275

    Console.Read();
}

它在 Window 7 上返回 2330/1275,但在 Windows 8 上返回 0/384。代码相同,都在 .NET Framework 4 Client Profile 下。

所以我做错了什么,或者这是 Windows 8 上的重大更改?

提前非常感谢。


感谢大家的帮助。对于第一种情况,我尝试了以下代码

        byte[] dataBytes = new byte[256 * 256 * 4 + 256];
        MemoryStream resultStream = new MemoryStream();
        DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress);
        deflateStream.Write(dataBytes, 0, dataBytes.Length);
        deflateStream.Close();
        Console.WriteLine(resultStream.ToArray().Length);

我在 Windows7 上得到 2338,在 Windows8 上得到 271。因此,Windows 8 似乎确实做了一些优化以使结果流更小。

【问题讨论】:

  • 您需要在流上调用 Close 以强制在压缩流上使用 WriteFinal
  • 您的代码一直是错误的。看起来 Win8 以一种明显的方式暴露了这个错误,但它之前也存在。
  • 你在 Win 7 上安装 .NET 4.5 吗? .NET 4.5 在 Win 7 上的结果是什么?和 Win 8 一样吗?
  • 我没有在 Win7 上安装 .NET 4.5,所以无法尝试。谢谢你们的帮助,伙计们。
  • 我想看看是.NET 4.5优化还是Win 8优化!

标签: .net visual-studio


【解决方案1】:

You should close and dispose 压缩流,以确保它已将所有数据写入底层流。

在两个系统上都试试这个:

byte[] dataBytes = new byte[256 * 256 * 4 + 256];

using(MemoryStream resultStream = new MemoryStream())
{
    using(DeflateStream deflateStream = new DeflateStream(resultStream, CompressionMode.Compress)
        deflateStream.Write(dataBytes, 0, dataBytes.Length);

    Console.WriteLine(resultStream.Length); // ?
}

第二个代码部分必须在其他系统上有 PNG 压缩差异。从 1275 -> 流大小下降趋势来看,可能工作得更好。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 2012-09-29
    • 2013-05-11
    • 2012-09-20
    • 2011-02-02
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多