C# - Assembly.Load - 抛出异常:mscorlib.dll中的'System.BadImageFormatException'

时间:2017-03-10 09:33:13

标签: c# .net resources mscorlib assembly.load

我想做一个关于从Resources运行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 {“无法加载从hm_1加载的文件或程序集'59088字节,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。尝试加载程序不正确format。“} System.Exception {System.BadImageFormatException}

我读过一些关于在x64平台模式下运行x86的帖子,反之,在视觉工作室中更改它,但仍然是同样的错误。

有没有人有想法? 注意:我不想在本地创建文件,只是从资源运行它。

1 个答案:

答案 0 :(得分:0)

您的代码仅适用于托管应用。 从资源运行托管应用程序的正确方法:

// 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();