Зачем возвращать BAD IL FORMAT для загрузки сборки из службы wcf? - PullRequest
1 голос
/ 10 марта 2012

Я хочу загрузить эту библиотеку классов :


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

У меня есть wcf service , который возвращает мне массив 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);
    }
}

Ошибка, возвращаемая мне в этом методе: AssemblyloadedAssembly = 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.

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Первое, что нужно проверить в этом сценарии, это то, что byte[], который вы получили, точно идентичен оригиналу, так как существует много способов запутать обработку фрагмента двоичного файла.Возможно, запишите файл на диск (File.WriteAllBytes) и ваш любимый инструмент для сравнения файлов, или используйте что-то вроде base-64 или sha-1 хеш для проверки содержимого.Я сильно подозреваю, что вы найдете, что это не то же самое.

1 голос
/ 15 мая 2012

Поскольку это один из первых результатов поиска в Google Bad IL format Я подумал, что объясню, что это значит.

BadImageFormatException выбрасывается, когда промежуточный язык сборки недопустим,В случае этого вопроса это было связано с усечением WCF, в моем случае DLL-библиотека .Net Framework была повреждена из-за сбоя жесткого диска.

Таким образом, в целом проблема будет существовать на уровне байтов, для этой проблемыв общем, я бы отладил его с помощью следующих шагов:

  1. Перекомпилируйте все возможное
  2. Выполните sfc в системе
  3. Выполните chkdsk
  4. Сравните байтовые потоки сборок (сделайте это сначала, если вы загружаете сборку из байтового потока)
...