4

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」を出力します。のソースコードを見ると、WebClient65536バイトのバッファサイズを使用しています。の問題を疑って、 :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バイトだけが読み取られます。ストリームの終わりの例外はスローされず、私が取得するバイトは見栄えがします。

応答ストリームの終了が早すぎるという問題のようですが、何が原因である可能性がありますか?

4

1 に答える 1

0

アセンブリ間にプラットフォーム ターゲットの不一致があります。

ほとんどの場合、32 ビット CLR では正常に動作する "AnyCPU" アセンブリと "x86" アセンブリの混合で、64 ビット CLR ではそうではありません (AnyCPU は 64 ビットとしてロードされ、x86 アセンブリへの依存関係が壊れるため)。

すべてのアセンブリが一貫したターゲット (すべての AnyCPU またはすべての x86) を持っていることを確認してください。

これを試すこともできます

 corflags myassembly.exe /32bit+

http://msdn.microsoft.com/en-us/library/ms164699%28v=vs.80%29.aspxを参照してください。

于 2013-02-28T13:14:34.870 に答える