为什么返回BAD IL FORMAT从wcf服务加载程序集?

时间:2012-03-10 08:13:38

标签: c# .net reflection appdomain

我想加载类库


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加载我的程序集。

2 个答案:

答案 0 :(得分:2)

在这种情况下要检查的第一件事是你收到的byte[] 完全相同,因为有许多方法可以处理一大块二进制文件。也许将文件写入磁盘(File.WriteAllBytes)和您最喜欢的文件比较工具,或使用类似base-64或sha-1哈希的内容来验证内容。我强烈怀疑你会发现它不一样。

答案 1 :(得分:1)

因为这是谷歌搜索Bad IL format时的第一个结果之一,我想我会解释这意味着什么。

当程序集的中间语言无效时,抛出

BadImageFormatException。在这个问题的情况下,由于WCF截断它,在我的情况下.Net Framework dll被一个失败的硬盘损坏。

所以一般来说问题将存在于字节级别,对于这个问题,我一般会用以下步骤调试它:

  1. 重新编译一切可能
  2. 系统
  3. Run sfc
  4. 运行chkdsk
  5. 比较程序集的字节流(如果从字节流加载程序集,请先执行此操作)