C# — Assembly.Load — выдано исключение: «System.BadImageFormatException» в mscorlib.dll

Я хотел бы провести эксперимент по запуску EXE-файла из ресурсов.

Assembly a = Assembly.Load(hm_1.Properties.Resources.HashMyFiles);
MethodInfo method = a.EntryPoint;
if (method != null)
{
     method.Invoke(a.CreateInstance("a"), null);
}

** Для этого эксперимента я использовал файл с именем HashMyFiles.exe, который находится в моих ресурсах.

Однако, когда я отлаживаю свой код, я получаю сообщение об ошибке:

ex {"Не удалось загрузить файл или сборку '59088 байт, загруженных из hm_1, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = null' или одна из ее зависимостей. Была предпринята попытка загрузить программу с неправильным форматом." } System.Exception {System.BadImageFormatException}

Я читал некоторые сообщения о запуске x86 в режиме платформы x64 и наоборот, меняя его в визуальных студиях, и все та же ошибка.

У кого-нибудь есть идея? Примечание: я не хочу создавать файл локально, только запускать его из ресурса.


person ItayNG    schedule 10.03.2017    source источник
comment
вы можете проверить с отдельным файлом вместо встроенного?   -  person Lei Yang    schedule 10.03.2017
comment
Отлично работает с Process.Start(). Однако я хочу сделать это с ресурсом.   -  person ItayNG    schedule 10.03.2017
comment
вам лучше извлечь ресурс в какой-нибудь временный файл, а затем загрузить.   -  person Lei Yang    schedule 10.03.2017
comment
Это был мой предыдущий эксперимент, который сработал. Я все еще ищу способ сделать это из моих ресурсов...   -  person ItayNG    schedule 10.03.2017
comment
Привет, @ItayNG. Я скопировал ваш код в свое тестовое решение, добавил файл .exe в ресурсы. Во время выполнения я успешно загружаю и запускаю файл .exe из ресурсов. Мой файл .exe написан на С#. Является ли ваш файл .exe управляемым или неуправляемым? Какой язык программирования вы используете для записи и компиляции .exe в ресурсах?   -  person Ivan Kishchenko    schedule 10.03.2017
comment
Привет @Ivan, на самом деле я просто поставил программу со своего компьютера, которую не создавал сам. Итак, насколько я понимаю сейчас, возможно ли запускать программы C # .exe только в том случае, если они встроены в качестве ресурсов?   -  person ItayNG    schedule 11.03.2017


Ответы (1)


Ваш код работает только для управляемых приложений. Правильный способ запуска управляемого приложения из ресурсов:

// You must change 'Properties.Resources.TestCs' to your resources path
// You needed to use 'Invoke' method with 'null' arguments, because the entry point is always static and there is no need to instantiate the class.
Assembly.Load(Properties.Resources.TestCs).EntryPoint.Invoke(null, null);

Но если у вас есть неуправляемое приложение в ресурсах, вы не сможете загрузить его как сборку. Вы должны сохранить его как файл «.exe» во временную папку и запустить как новый процесс. Этот код отлично работает для всех типов приложений (управляемых и неуправляемых).

// Generate path to temporary system directory.
var tempPath = Path.Combine(Path.GetTempPath(), "testcpp.exe");

// Write temporary file using resource content.
File.WriteAllBytes(tempPath, Properties.Resources.TestCpp);

// Create new process info
var info = new ProcessStartInfo(tempPath);

// If you need to run app in current console context you should use 'false'.
// If you need to run app in new window instance - use 'true'
info.UseShellExecute = false;

// Start new system process
var proccess = Process.Start(info);

// Block current thread and wait to end of running process if needed
proccess.WaitForExit();
person Ivan Kishchenko    schedule 13.03.2017
comment
Большое спасибо :) Я так и думал. - person ItayNG; 14.03.2017