【问题标题】:Why return BAD IL FORMAT to load assembly from wcf service?为什么返回 BAD IL FORMAT 以从 wcf 服务加载程序集?
【发布时间】:2012-03-10 08:13:38
【问题描述】:

我想加载这个类库


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);
    }
}

在这个方法中返回错误:Assembly loadedAssembly = AppDomain.CurrentDomain.Load(binary);

错误:

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

【问题讨论】:

标签: c# .net reflection appdomain


【解决方案1】:

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

【讨论】:

  • @Yahia 我从没说过;但由于它是基于文本的,而且对于这样一个简单的示例,文件应该很短,所以应该很容易观察两个 base-64 字符串,看看它们是否明显不同。
  • 很好,因为试图教别人钓鱼而投了反对票。但是,我坚持答案:直到 OP 跟进“我比较了文件,它们是相同的”,这仍然是最明显的事情,并改变了问题的性质。重要的是,他们不会在谷歌上搜索“BAD IL FORMAT”(这不是问题),而是会知道谷歌“文件被 WCF 截断”,或者可能发布他们的“发送”代码供我们接受和诊断。
  • @Yahia 我不怀疑你这样做了 - 它是针对任何人这样做的(正如 -1 分数所证明的那样)
  • @Marc:我投票给你-1。但我检查了接受的答案。为什么说接受。你的回答与我的问题无关。与 WCF 无关。我不喜欢您的回答。您的回答可能会误导其他开发人员。你不能给所有时间正确的答案。您可能会误解,或者我无法正确说出我的问题。有赞成票也有反对票。不接受
  • @programmerist 我很困惑:首先,没有人提到“接受”;现在,答案要么有帮助,要么没有。如果没有帮助,请不要将其标记为已接受的答案。如果它确实有帮助(即内容不相同),那就太好了!但回到正题:收到的byte[] 是否与原始文件相同,是还是否?如果是,那很好——让我们都知道;如果不是,那么这与问题直接相关。
【解决方案2】:

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

BadImageFormatException 当程序集的中间语言无效时抛出。在这个问题的情况下,这是由于 WCF 截断了它,在我的情况下,.Net Framework dll 被故障硬盘损坏。

所以一般来说问题会存在于字节级别,对于这个问题,我一般会通过以下步骤进行调试:

  1. 重新编译所有可能的东西
  2. 系统上的Run sfc
  3. 运行chkdsk
  4. 比较程序集的字节流(如果要从字节流加载程序集,请先进行此操作)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多