我有一个桌面应用程序,它从网络服务器下载一些 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 个字节。没有抛出流结束异常,我得到的字节看起来不错。

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

最佳答案

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

很可能是“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

关于c# - 在某些 XP 机器上首次读取后流关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15022976/

10-09 00:51