首页 文章

在一些XP机器上首次读取后,流关闭

提问于
浏览
4

我有一个桌面应用程序从Web服务器下载一些dll,然后用 Assembly.Load 加载它们 . 在一台XP机器上,第二次运行应用程序时,BadImageFormatExceptions被抛出 . 在其他Win 7和XP机器上,它工作正常 .

看来只返回了dll的前65536个字节,而这只发生在缓存下载的dll时 .

什么可能导致截断?

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

client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Reload);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);

这有效,在这种情况下打印“Got 159744” .

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

client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);

在大多数机器上,这会输出"Got 159744",但是在破坏的XP机器上,输出"Got 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);

在这种情况下,只输出一个“Read ...”行,并且只读取16384个字节 . 抛出流异常没有结束,我得到的字节看起来很好 .

这似乎是响应流过早结束的问题,但是可能导致这种情况的原因是什么?

1 回答

  • 0

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

    很可能混合使用“AnyCPU”和“x86”程序集在32位CLR上工作正常,而不是在64位CLR上工作(因为AnyCPU加载为64位,这打破了对x86程序集的依赖性) .

    确保所有程序集都具有一致的目标 - 所有AnyCPU或所有x86 .

    你也可以试试这个

    corflags myassembly.exe /32bit+
    

    http://msdn.microsoft.com/en-us/library/ms164699%28v=vs.80%29.aspx

相关问题