C# 使用任何cpu编译时System.BadImageFormatException异常

C# 使用任何cpu编译时System.BadImageFormatException异常,c#,badimageformatexception,C#,Badimageformatexception,当我使用“任意CPU”编译应用程序时,每当我尝试使用Firebird embedded dll打开连接时,我都会得到System.BadImageFormatException(不要问我为什么仍然使用这个遗留数据库。这不是我的选择) 然后我想这一定是因为dll只支持32位模式。因此,我尝试使用x86进行编译,这次确实运行良好 然而,当我使用x64编译时,应用程序仍然运行良好。这使我困惑,因为它清楚地表明dll能够以64位模式加载 我又做了两次测试,结果如下: 任何CPU:64位进程。System

当我使用“任意CPU”编译应用程序时,每当我尝试使用Firebird embedded dll打开连接时,我都会得到
System.BadImageFormatException
(不要问我为什么仍然使用这个遗留数据库。这不是我的选择)

然后我想这一定是因为dll只支持32位模式。因此,我尝试使用x86进行编译,这次确实运行良好

然而,当我使用x64编译时,应用程序仍然运行良好。这使我困惑,因为它清楚地表明dll能够以64位模式加载

我又做了两次测试,结果如下:

任何CPU:64位进程。System.BadImageFormatException
x86:32位进程。运行良好
x64:64位进程。运行良好
任何CPU(首选32位):32位进程。运行良好

我认为CPU唯一的神奇之处在于它能在启动时选择是否以32/64位模式启动进程。如果应用程序在严格的64位模式下运行良好,那么我希望任何CPU都能在同一台64位机器上正常运行

我更喜欢使用任何CPU(没有32位优先标志),因为它使分发更容易

是什么导致了异常?是否有办法处理

编辑:
所以我尝试使用反射来获取程序集信息,这是我得到的错误消息

使用“1”参数调用“GetAssemblyName”时出现异常:“无法” 加载文件或程序集“fbedded.dll”或其某个依赖项 模块应包含程序集清单。”第1行字符:1 +[reflection.assemblyname]::GetAssemblyName(“${pwd}\fbedded.dll”)|fl + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:NotSpecified:(:)[],MethodInvocationException +FullyQualifiedErrorId:BadImageFormatException


在检查了dll的头文件之后,结果表明Nuget是执行此魔术的人。如果我将目标设置为x86/x64,nuget将在编译期间包含相应版本的dll


但如果我以“任何CPU”为目标,nuget将选择dll的x86版本。因此,如果我尝试以64位模式启动应用程序,它将抛出BIFE

检查每种情况下装配的图像。32位和64位中的图像是否相同(我猜不是因为32位图像无法在64位进程中加载,反之亦然)。还要检查有问题的程序集上的元数据,IIRC有.Net工具,但您可以使用dotPeek或类似工具(有一个开源等效工具,我忘记了它的名称)。解决方案平台的名称与C#程序无关,体系结构和位性是在运行时确定的,而不是在构建时确定的。只有抖动偏好才重要。因此,始终保持AnyCPU作为平台名称,使用Project>Properties>Build选项卡覆盖默认的抖动选择。“首选32位”是您喜欢的。@HansPassant but Prefere 32位将在32位模式下启动应用程序,即使在64位机器上也是如此,这不是我们想要的。这是一个非常令人费解的评论,因为您知道您使用的数据库提供程序不能在64位模式下运行。“我不能对那个大脑错误进行反向工程。@汉帕桑如果我将整个解决方案设置为64位,它将在64位模式下工作。”。这是唯一一个给我带来麻烦的CPU。这就是我所怀疑的,这就是为什么我建议查看元数据。不管怎样,很高兴你找到了答案。