C# 流在某些XP机器上首次读取后关闭

C# 流在某些XP机器上首次读取后关闭,c#,caching,stream,C#,Caching,Stream,我有一个桌面应用程序,它从web服务器下载一些DLL,然后用Assembly.Load加载它们。在一台XP机器上,我第二次运行应用程序时抛出了BadImageFormatException。在其他Win7和XP机器上,它运行良好 似乎只返回了dll的前65536字节,并且只有在缓存下载的dll时才会发生这种情况 什么会导致截断 下面是我如何重现这个问题的。首先,下载文件并将其添加到缓存: client = new WebClient(); client.CachePolicy = new Req

我有一个桌面应用程序,它从web服务器下载一些DLL,然后用
Assembly.Load
加载它们。在一台XP机器上,我第二次运行应用程序时抛出了BadImageFormatException。在其他Win7和XP机器上,它运行良好

似乎只返回了dll的前65536字节,并且只有在缓存下载的dll时才会发生这种情况

什么会导致截断

下面是我如何重现这个问题的。首先,下载文件并将其添加到缓存:

client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Reload);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
这项工作,在这种情况下,印刷“得到159744”

通常我会使用
RequestCacheLevel.Deafult
,但为了可靠地重新产生问题,我只从缓存中读取第二个请求:

client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
在大多数机器上,这个输出“得到159744”,然而在正在崩溃的XP机器上,这个输出“得到65536”。查看
WebClient
的源代码,它使用了65536字节的缓冲区大小。由于怀疑
WebClient
有问题,我使用
WebRequest
直接复制了该问题:

request = WebRequest.Create(url);
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
responseStream = request.GetResponse().GetResponseStream();
var buffer = new byte[16384];
using (var memoryStream = new MemoryStream())
{
    int read;
    while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        Console.WriteLine("Read... " + read + " bytes");
        memoryStream.Write(buffer, 0, read);
    }
    data = memoryStream.ToArray();
}
Console.WriteLine("Got " + data.Length);
在这种情况下,只输出一个“读取…”行,只读取16384字节。没有引发流结束异常,我得到的字节看起来不错


响应流结束得太快似乎有问题,但是什么原因造成的?

程序集之间存在平台目标不一致

很可能是“AnyCPU”和“x86”程序集的混合,在32位CLR上运行良好,而在64位CLR上则不是这样(因为AnyCPU加载为64位,这打破了对x86程序集的依赖)

确保所有程序集都有一个一致的目标—所有AnyCPU或所有x86

你也可以试试这个

 corflags myassembly.exe /32bit+

请参见

我正试图下载大约10个.NET程序集,总计约11MB。我测试的对象是一个156KB的dll。我也有一台x86测试XP机器,它在那里工作。我正在试图找出造成这两台机器之间差异的原因,还有其他的想法吗?你们处理WebClient吗?还有responseStream?不,我没有处理网络客户。我现在是,但很不幸,结果是一样的。你有没有试过在那台机器上用其他程序下载?如果这样做有效,那么您可能会怀疑您的程序(或WebClient)。如果它不工作,那么您的网络堆栈或硬件可能有问题。机器坏了。扔掉它,这不值得你花时间。你为什么认为这是平台目标的问题?如果client.DownloadData没有返回具有正确长度的数组,那么平台目标肯定不重要吗?或者平台目标不一致会导致缓存不工作吗?