Webサーバーからいくつかのdllをダウンロードし、それらをでロードするデスクトップアプリケーションがありますAssembly.Load
。1台のXPマシンで、アプリケーションを2回実行したときにBadImageFormatExceptionsがスローされていました。他のWin7およびXPマシンでは、正常に機能しました。
dllの最初の65536バイトのみが返され、ダウンロードされたdllがキャッシュされた場合にのみ発生したようです。
何が切り捨てを引き起こす可能性がありますか?
これが私が問題を再現した方法です。まず、ファイルをダウンロードして、キャッシュに追加します。
client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Reload);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
これは機能します。この場合、「Got159744」を印刷します。
通常はを使用しますRequestCacheLevel.Deafult
が、問題を確実に再現するために、2番目のリクエストのキャッシュからのみ読み取ります。
client = new WebClient();
client.CachePolicy = new RequestCachePolicy(RequestCacheLevel.CacheOnly);
data = client.DownloadData(url);
Console.WriteLine("Got " + data.Length);
ほとんどのマシンでは、これは「Got 159744」を出力しますが、壊れているXPマシンでは、これは「Got65536」を出力します。のソースコードを見ると、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 ...」行が1つだけ出力され、16384バイトだけが読み取られます。ストリームの終わりの例外はスローされず、私が取得するバイトは見栄えがします。
応答ストリームの終了が早すぎるという問題のようですが、何が原因である可能性がありますか?