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



我有一个桌面应用程序,它从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);

在大多数机器上,这会输出"Got 159744",但在XP机器上,它会输出"Get 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个字节。没有抛出流结束异常,并且我得到的字节看起来很好。

响应流过早结束似乎是个问题,但是什么原因造成的呢?

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

很可能是"AnyCPU"one_answers"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

相关内容

  • 没有找到相关文章

最新更新