【问题标题】:Assembly.Load throws a bad format exception if i load a winform application如果我加载 winform 应用程序,Assembly.Load 会引发错误的格式异常
【发布时间】:2013-03-12 22:08:35
【问题描述】:

这是我得到的错误代码

System.BadImageFormatException: impossible to load the file or assembly '6632 bytes loaded from quick test 2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Attempt to load a program in a bad format.
Nome file: '6632 bytes loaded from quick test 2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.BadImageFormatException: Format IL not correct.
   in System.Reflection.Assembly.nLoadImage(Byte[] rawAssembly, Byte[] rawSymbolStore, Evidence evidence, StackCrawlMark& stackMark, Boolean fIntrospection)
   in System.Reflection.Assembly.Load(Byte[] rawAssembly)
   in quick_test_2.Form1.button2_Click(Object sender, EventArgs e) in C:\Users\HHH\Documents\Visual Studio 2010\Projects\quick test 2\quick test 2\Form1.cs:riga 175
   in System.Windows.Forms.Control.OnClick(EventArgs e)
   in System.Windows.Forms.Button.OnClick(EventArgs e)
   in System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   in System.Windows.Forms.Control.WndProc(Message& m)
   in System.Windows.Forms.ButtonBase.WndProc(Message& m)
   in System.Windows.Forms.Button.WndProc(Message& m)
   in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

当我尝试加载一个简单的 Windows 窗体应用程序(.net c#)时

我使用的代码是这样的

try 
{
    Assembly myAsm = Assembly.Load(File.ReadAllBytes("myFile.exe"));
    MethodInfo myMethod = assm.EntryPoint;
    object myObj = assm.CreateInstance(myMethod.Name);
    myMethod.Invoke(o, null);
}
catch 
{
    //error
}

到目前为止,我只设法使它适用于我删除 Form 并从 Program.cs 中的 [STAThread] 运行代码的表单应用程序,它甚至不适用于简单的控制台应用程序。

对此有何见解?

【问题讨论】:

  • 听起来那个EXE文件实际上不是EXE文件。
  • 我很确定它是一个exe,我自己编译了测试exe
  • 至少摆脱 File.ReadAllBytes(),这没有任何作用,只是添加了另一种可能失败的方式。目标平台和 .NET 框架版本不匹配是此异常的其他原因。

标签: c# reflection methods invoke assembly.load


【解决方案1】:

您加载的程序集是否为与主机 exe 相同的 CPU 架构构建(x86 与 x64)?如果主机程序集设置为“任何 CPU”并且加载的程序集设置为 x86,这将在 64 位计算机上导致问题。

【讨论】:

  • 额外信息:问题出在此处 Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089,在异常信息中显示版本为 1.0.0.0,publickeytoken 为空跨度>
【解决方案2】:

当您更改 .csproj 的目标框架并将其恢复为您开始使用的框架时,通常会发生这种情况。在你疯狂尝试谷歌搜索正确的解决方案之前,请确保:

  1. 检查app.config中启动标签下是否supportedRuntime version="a different runtime from cs project target"。

  2. 这也意味着检查可能是属性文件夹中的其他自动生成文件或其他文件,以查看这些文件与 .csproj 文件中定义的文件之间是否不再存在运行时不匹配。

在您开始尝试使用项目属性进行不同操作以克服错误之前,这些可能会为您节省大量时间。

【讨论】:

  • 我做了一个快速测试,结果证明你是对的,每当我更改项目的版本并且再次更改它时,程序集都会给我加载问题。我想我必须从一开始就选择版本。
【解决方案3】:

我确实认为问题在于调用应用程序本身就是一个 winform 应用程序。我从一个简单的 [Stathread] 手动启动了该程序,它工作正常。我不知道这算不算解决了

【讨论】:

  • Winforms 应用程序将默认以 .NET 客户端配置文件为目标,这将无法使用完整的 .NET 加载应用程序(默认为控制台应用程序)。尝试将 Winforms 项目属性中的目标框架更改为完整的 .NET,看看是否可以修复它。
  • 酷。你能接受我原来的答案,这样我至少能得到一些分数吗? ;-)
  • 您的原始答案是评论,我没有选择接受它:/
  • 不,看看我的用户名。我还写了关于 x86 与 x64 的另一个答案。
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2021-11-11
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
相关资源
最近更新 更多