2012-03-10 11 views
1

私はこのクラスライブラリをロードしたい:wcfサービスからアセンブリをロードするためにBAD IL FORMATを返すのはなぜですか?


namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
     } 
     public static int Sum(int a, int b) 
     { 
      return a + b; 
     } 
    } 
} 

私は私に戻っWCFサービスbyte[]配列(ClassLibrary1の)を持っている私は、このアセンブリに

static void Main(string[] args) 
{ 
    FileTransferService.ApplicationHostServiceClient client = new FileTransferService.ApplicationHostServiceClient(); 

    FileTransferService.AssemblyPackage[] asmbs = client.GetFile(); 
    //var newDomain = AppDomain.CreateDomain("FooBar", null, null); 
    foreach (FileTransferService.AssemblyPackage item in asmbs) 
    { 
     byte[] mybuffer = item.Buffer; 
     new AssemblyLoader().LoadAndCall(mybuffer); 
    } 
} 

public class AssemblyLoader : MarshalByRefObject 
{ 
    public void LoadAndCall(byte[] binary) 
    { 
     Assembly loadedAssembly = AppDomain.CurrentDomain.Load(binary); 
     object[] tt = { 3, 6 }; 
     Type typ = loadedAssembly.GetType("ClassLibrary1.Class1"); 
     MethodInfo minfo = typ.GetMethod("Sum", BindingFlags.Public); 
     int x = (int)minfo.Invoke(null, tt); 
     Console.WriteLine(x); 
    } 
} 
をロードすることはできません

このメソッドでエラーが返されます。アセンブリloadedAssembly = AppDomain.CurrentDomain.Load(バイナリ);

ERROR:

BADIMAGEFORMAT EXCEPTION 
Could not load file or assembly '4096 bytes loaded from Client2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format. 

例外:

Bad IL format 

私はこの種のエラーが、無厳密解をグーグルでてきました。 AppDomainを使用してアセンブリをロードします。バイナリのチャンクを渡すの混乱を作成する多くの方法があるよう

+0

4096バイトは、おそらくこれに似た何らかのWCF制限のような疑いがあると聞こえます。 https://fudofuad.wordpress.com/2010/04/26/wcf-streaming-allows-only-4k-4096-bytes-chunks-at-a-time/ –

+0

サーバーのサイドコードの読み取り/送信アセンブリ? –

答えて

2

このシナリオでは、最初に確認することは、あなたが受け取ったbyte[]がオリジナルと同じ正確であるということです。ファイルをディスク(File.WriteAllBytes)とお気に入りのファイル比較ツールに書き込むか、base-64やsha-1ハッシュのようなものを使って内容を検証してください。私はあなたがそれが同じではないことを強く疑う。

+0

AFAIKベース64はハッシュではありません... – Yahia

+0

@Yahia私は決して言いませんでした。テキストベースであり、このような簡単な例ではファイルが短くなければならないため、2つの64進の文字列を見て、明らかに異なるかどうかを確認するのは簡単です。 –

+3

ニース、誰かに魚を教えることを試みるためのダウンボート。しかし、私は答えを立てています: "私はファイルを比較して、彼らは同一でした"とOPがフォローアップされるまで、これは最も目立つものであり、問​​題の性質を変えます。重要なのは、 "悪いフォーマット"(グーグルでは問題ありません)をグーグルではなく、 "WCFで切り取ったファイル"をGoogleに知らせるか、 "送信"コードを送信して診断するということです。 –

1

これはグーグルBad IL formatで初めての結果の1つなので、私はその意味を説明したいと思っていました。

BadImageFormatExceptionは、アセンブリの中間言語が無効な場合にスローされます。この質問のケースでは、WCFがそれを切り捨てることが原因でした。私のケースでは、.Net Framework dllが、故障したハードドライブによって破損していました。だから、一般的には問題は、私はこれらの手順でそれをデバッグしたい一般的にこの問題のために、バイトレベルで存在する

  1. 再コンパイル
  2. Run sfc可能なすべてのシステム
  3. 実行にchkdsk
  4. アセンブリのバイトストリームを比較する(バイトストリームからアセンブリをロードする場合は、最初に実行する)
関連する問題