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, Culture= нейтральный, PublicKeyToken=null'или одной из ее зависимостей. Была предпринята попытка загрузить программу с неверным форматом."} System.Exception {System.BadImageFormatException}
Я читал некоторые посты о запуске x86 в режиме платформы x64 и наоборот, об изменениях в визуальных студиях и все той же ошибке.
У кого-нибудь есть идея? Примечание: я не хочу создавать файл локально, только чтобы запустить его из ресурса.
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();