.Net 程序在运行中出现System.BadImageFormatException的解决方法

原文链接:https://docs.microsoft.com/en-us/dotnet/api/system.badimageformatexception?view=net-5.0

本文是翻译上面而来,如果有任何错误,请指正。

当动态链接库(.dll文件)或可执行文件(.exe文件)的文件格式不符合公共语言运行库期望的格式时,将引发此异常。 特别是在以下情况下会引发异常:

1 .NET实用程序的早期版本(例如ILDasm.exe或installutil.exe)与通过更高版本的.NET开发的程序集一起使用。若要解决此异常,请使用与用于开发程序集的.NET版本相对应的工具版本。 这可能需要修改Path环境变量或为正确的可执行文件提供完全限定的路径。

2 试图加载非托管动态链接库或可执行文件(例如Windows系统DLL),就像它是.NET程序集一样。 下面的示例通过使用Assembly.LoadFile方法加载Kernel32.dll来说明这一点。

 1 // Windows DLL (non-.NET assembly)
 2 string filePath = Environment.ExpandEnvironmentVariables("%windir%");
 3 if (! filePath.Trim().EndsWith(@"\"))
 4    filePath += @"\";
 5 filePath += @"System32\Kernel32.dll";
 6 
 7 try {
 8    Assembly assem = Assembly.LoadFile(filePath);
 9 }
10 catch (BadImageFormatException e) {
11    Console.WriteLine("Unable to load {0}.", filePath);
12    Console.WriteLine(e.Message.Substring(0,
13                      e.Message.IndexOf(".") + 1));
14 }
15 // The example displays an error message like the following:
16 //       Unable to load C:\WINDOWS\System32\Kernel32.dll.
17 //       The module was expected to contain an assembly manifest.

3.试图在除仅反射上下文之外的上下文中加载参考程序集。可以通过以下两种方式之一解决此问题:

  •        可以加载实现程序集而不是参考程序集。
  •        可以通过调用Assembly.ReflectionOnlyLoad方法在仅反射的上下文中加载参考程序集

4. DLL或可执行文件以64位程序集的形式加载,但包含32位功能或资源。例如,它依赖于COM互操作或调用32位动态链接库中的方法。解决的方法:请将项目的Platform target属性设置为x86(而不是x64或AnyCPU)并重新编译。

5.应用程序的组件是使用.NET的不同版本创建的。通常,当使用.NET Framework 1.0或.NET Framework 1.1开发的应用程序或组件尝试加载使用.NET Framework 2.0 SP1或更高版本开发的程序集时,或者当开发了应用程序时,会发生此异常。使用.NET Framework 2.0 SP1或.NET Framework 3.5尝试加载使用.NET Framework 4或更高版本开发的程序集。 BadImageFormatException可能会报告为编译时错误,或者可能在运行时引发异常。下面的示例定义一个StringLib类,该类具有单个成员ToProperCase,并且位于名为StringLib.dll的程序集中。

6.应用程序的组件针对不同的平台。 例如,您尝试在x86应用程序中加载ARM程序集。 您可以使用以下命令行实用工具来确定单个.NET程序集的目标平台。 文件列表应在命令行以空格分隔的列表形式提供。

posted @ 2021-02-19 15:55  VarForrest  阅读(697)  评论(0编辑  收藏  举报