原文链接: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 += @"System32Kernel32.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:WINDOWSSystem32Kernel32.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程序集的目标平台。 文件列表应在命令行以空格分隔的列表形式提供。