CodeDom + Assembly.Load вызывает исключение BadImageFormatException

Я пытаюсь выполнить файл из заданного массива байтов, который отлично работает:

byte[] bytes = File.ReadAllBytes(@"C:\Location\program.exe");
MessageBox.Show(bytes.Length) // The same size for both the VS compiled and CodeDom compiled application
Assembly assembly = Assembly.Load(bytes); //Throws exception when compiled with CodeDOM

Этот код компилируется и отлично работает из приложения, которое я создал с помощью Visual Studio.

Однако когда я добавляю этот фрагмент кода в приложение, созданное с помощью CodeDOM, возникает исключение BadImageException.

Приложение, сгенерированное CodeDOM, прекрасно считывает байты, потому что обе версии выводят одинаковую длину byte[].

Я попытался изменить целевую структуру с .NET 2.0 на .NET 4.5, я попытался изменить целевую архитектуру, но не смог заставить ее работать.

Что может вызвать это исключение?


person John    schedule 17.12.2014    source источник
comment
Возможно, это из-за 64-битного и 32-битного конфликта. Вы можете попробовать загрузить сборку в другом типе архитектуры. Проблема либо с вашей сборкой, либо с программой, которая загружает эту сборку.   -  person dotnetstep    schedule 17.12.2014
comment
Я установил целевую архитектуру для сборки на x86, и теперь приложение codeDOM может загрузить ее без проблем, спасибо! Однако почему у приложения, созданного с помощью VS2012, нет этой проблемы?   -  person John    schedule 17.12.2014
comment
Нет, это не так. Это то, как вы строите свой проект. Я подробно опишу в ответе, чтобы сценарий мог быть полезен другим.   -  person dotnetstep    schedule 17.12.2014
comment
Что не похоже на что? Приложение, которое я создал с помощью VS, отлично запускало сборку «любой процессор», в то время как приложение, сгенерированное CodeDOM, может запускать только «x86» в моей 64-битной системе?   -  person John    schedule 17.12.2014
comment
Делать это вообще нет смысла, вместо этого используйте CompilerResults.CompiledAssembly.   -  person Hans Passant    schedule 17.12.2014


Ответы (1)


Проблема заключается в архитектуре сборки и приложении, которое загружает сборку.

Таким образом, если приложение создается с помощью X64 и если оно пытается загрузить сборку с помощью X86, это создает проблему. Это применимо и в противоположном случае.

Другой сценарий заключается в том, что при сборке приложения с помощью Visual Studio параметр по умолчанию — Любой ЦП.

В этом случае, когда процесс 64-битный, он будет загружаться как 64-битный, а когда приложение 32-битное, он загружается как 32-битный. Мы ограничиваем этот способ, потому что некоторые неуправляемые ресурсы работают в специальной среде.

Я сталкиваюсь с такой проблемой с клиентом Oracle .net.

person dotnetstep    schedule 17.12.2014