问题标签 [badimageformatexception]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
936 浏览

asp.net - .NET 程序集格式有大小限制吗?

我们遇到了一个我以前从未遇到过的有趣问题。我们在 Visual Studio 2008 SP1 中有一个大规模生产的 ASP.NET 3.5 SP1 Web 应用程序项目,它使用网站部署项目进行编译和部署。去年一切正常,直到昨天签入后,该应用程序开始严重失败,并出现BadImageFormatException.

有问题的签到并没有改变任何特别的东西,错误来自应用程序的甚至没有改变的区域。使用 Reflector 我们检查了有问题的方法,发现代码中有垃圾字符串(.NET Reflector 幽默地将其解释为汉字)。我们一直在多台机器上复制此内容,因此它似乎与硬件无关。

进一步检查表明,在部署期间用作aspnet_merge.exe输入的程序集中不存在这些垃圾字符串。

aspnet_merge.exe / Web 部署项目输出程序集属性:

  • 将所有输出合并到一个程序集中
  • 将每个单独的文件夹输出合并到自己的程序集中
  • 将所有页面和控制输出合并到一个程序集中
  • 为每个页面创建单独的程序集并控制输出

在 Web 部署项目属性中,如果我们将合并选项设置为第一个选项(“将所有输出合并到单个程序集”),我们会遇到问题,但所有其他选项都可以正常工作!

我的问题:有人知道为什么会这样吗?aspnet_merge.exe 的功能是否有大小限制(生成的合并 DLL 约为 19.3 MB)?合并 WAP 的输出是否还有其他已知问题?

如果任何汇编格式/aspnet_merge.exe 专家知道这样的限制,我会很高兴。在我看来,就像一个 25MB 的程序集,虽然很大,但并不离谱。

0 投票
6 回答
3824 浏览

c# - ClickOnce:在 64 位窗口上运行 x86 包时出现 BadImageFormatException

我的 .NET 2.0 应用程序导入非托管 32 位 dll。当用户通过应用程序中的对话框打开文件时,将加载 dll(发生第一次互操作调用)。

当我通过 clickonce 使用目标平台“Any”部署应用程序时,64 位窗口上的用户在尝试从应用程序打开文件时会收到 BadImageFormatException(此时加载了非托管 dll)。我知道这是由于 64 位进程和 32 位非托管 dll 的位数不兼容。

我已经使用 x86 作为目标平台重新部署了应用程序。据我了解,这应该可以解决位数问题。

当我在 64 位系统上运行为 x86 构建的已部署应用程序时,我现在在应用程序启动之前立即收到 BadImageFormatException。在至少三台 64 位机器上测试。在 32 位机器上,它可以正常工作。

当我直接从 VS 运行应用程序时(或者不直接运行,只是正常构建,不通过 ClickOnce),使用 x86 目标平台时在 64 位窗口上没有问题。应用程序启动并且用户可以加载文件 - 互操作调用成功。

我已经连续调试了 2 天,但没有任何结果 - 我在不同的计算机上尝试过。它似乎始终可以在我尝试过的一台计算机上运行。但是,我没有永久访问这台计算机的权限。

我已经设法在我的计算机上构建了一次 ClickOnce 部署,它在 64 位机器上运行。这可能是 100 次尝试中的一个!什么都没有改变,唯一改变的变量是我在计算机重新启动后立即成功构建。

我做了很多次清理/重建/重新启动VS/重新启动窗口。我已经重新安装了 VS 2008,现在也重新安装了整个操作系统,但没有帮助。


编辑:我刚刚设法获得了一个好的构建(接下来的 100 个:))并在部署的目录之间进行了比较。问题的根源是ClickOnce在主.exe的清单中生成了错误的目标平台:

处理器架构应该是 x86。

所以问题是如何在部署时始终强制 VS 在清单中生成正确的处理器架构。

有人可以帮忙吗?

0 投票
24 回答
573201 浏览

.net - 即使平台相同,“试图加载格式不正确的程序”

我正在从 64 位系统上的 32 位非托管 DLL 调用函数。我得到的是:

BadImageFormatException:试图加载格式不正确的程序。(来自 HRESULT 的异常:0x8007000B)

起初,我将我的项目设置为 Any CPU 平台,因此我将它们都更改为 x86,但仍然出现此错误。这真的是我所知道的唯一解决方法。

DLL 没有损坏或任何东西,因为我可以将它们与其他程序一起使用(我没有源代码)。我想也许它没有找到依赖关系,但我检查了一下,它们都在那里。DllNotFoundException另外,在那种情况下它不会抛出一个吗?

我还可以做些什么?在您说“改用 64 位非托管 DLL”之前,让我指出没有。;)

0 投票
1 回答
228 浏览

asp.net - 发布同时支持 64 位和 32 位的 Web 二进制文件?ASP.NET

我想发布我的应用程序同时支持 32 位和 64 位。我正在使用 elmah 和 SQLite。这两个软件包都有一个单独的 32 位和 64 位二进制文​​件。我不能同时添加 32 位和 64 位 DLL。我尝试在我的 bin/release 文件夹中添加具有不同文件名的 32 位和 64 位 DLL,但出现错误的图像格式错误。(我通过在 64 位 Windows 服务器上运行并在目录中和我的系统上运行 32 位 DLL 进行了测试)。

我如何发布应用程序,以便可以将同一文件夹作为 32 位或 64 位运行?

0 投票
5 回答
12055 浏览

c# - “ResolveAssemblyReference”任务失败并且 System.BadImageFormatException,但在任何地方都没有使用程序集!

我收到关于程序集“C:\Ora10g\bin\Zip.exe”的错误。问题是这个解决方案根本不使用 Oracle 中的任何东西。我在项目的任何地方都找不到对 10g 的单一引用。我从另一个离开我们小组的人那里继承了这个。他从来没有遇到过这个问题。我团队的另一位成员说他以前得到过这个,但重新安装 10g 的客户端部分修复了它。那里没有这样的运气。我什至尝试使用 WinGrep 在整个解决方案文件夹中搜索“Ora10g”,但它不存在。

有任何想法吗?在弄清楚如何摆脱对 Oracle 的错误引用之前,我无法构建此解决方案。

VS 2005 解决方案。包含几个 WinForm 应用程序、几个类库和一个 Web 服务。错误发生在主类库项目中。

这是错误消息:

0 投票
11 回答
72259 浏览

c# - 加载 32 位 DLL 时出现 BadImageFormatException,目标是 x86

我有一个 DLL (FreeType),它肯定是 32 位的(头文件:IMAGE_FILE_MACHINE_I386)。

我想使用 DllImport 从 C# 代码中使用它。

我的应用程序的目标是 x86,IntPtr.Size 是 4,进程是 32 位。

但是我得到了 BadImageFormatException(来自 HRESULT 的异常:0x8007000B)。有什么问题?

当然,我使用的是 64 位 Windows 7。

0 投票
2 回答
671 浏览

oracle - 有人在 Sql Server Reporting Services、64 位操作系统和 Oracle 数据源中看到过这种行为吗?

我正在开发一个 Sql Server Reporting Services 解决方案,该解决方案跨 Sql Server 数据源和 Oracle 10g 数据源进行查询。我的开发盒是带有 Sql Server 2008R2 的 Windows 7 64 位,我在该系统上托管 IIS7 和 SSRS 以进行开发;使用 VS.NET 设计报告。

我在运行报告时遇到错误,其中 SSRS 抱怨在 64 位进程中加载​​ 32 位 Oracle 客户端。关于如何解决这个问题有很多线程。问题是,他们都归结为确保您拥有 64 位 Oracle 客户端,我就是这样做的。我遇到的奇怪的事件链是这样的:

  • 创建初始 Oracle 数据源并连接报告(有效)
  • 编辑 Oracle 数据源连接(它停止使用 BadImageFormatException 32 位/64 位错误消息)
  • 卸载并重新安装 Oracle 客户端(它可以工作)
  • 再次编辑 Oracle 连接(它停止使用 BadImageFormatException 32 位/64 位错误消息)

每次更改连接字符串时都没有重新安装客户端,我完全不知所措。有没有人见过这种行为?如果是这样,我到底做错了什么?

0 投票
2 回答
1524 浏览

.net - BadImageFormatException 与 Windows 7 64 中的 .NET ILMerged DLL

我正在使用 Visual Studio 2008 在 Windows 7 64 位中进行开发。我有一组类库,我使用 ILMerge 将它们合并到一个 DLL 中。但是,当我尝试使用这个合并的 DLL 时,我得到了

[ BadImageFormatException : 无法加载文件或程序集“MyMergedDll”或其依赖项之一。试图加载格式不正确的程序。]

我一直在四处寻找帮助,看起来我需要在 MyMergedDll 中的每个项目中将 Build 属性设置为以 x86 为目标,所以我这样做了。我还在 Web 服务中设置了所有非 MSTest 项目,其中我将 MyMergedDll 引用为目标 x86。但是,我仍然收到此错误。

如果可以相信此博客条目,我会因为执行以下操作而收到此错误:

也就是说,对泛型具有类约束。不过,博客条目是 2007 年的,所以我不知道这是否仍然适用。在我追踪项目中的每个泛型类以检查约束之前,我想从 StackOverflow 获得一些关于你们认为问题所在的信息。

如果重要,MyMergedDll 是强名称签名的。我正在尝试在控制台应用程序和 Web 服务中使用 MyMergedDll。我不知道每次重建 Web 服务时 IIS 是否都在更新,这是否会使事情变得复杂。使用控制台应用程序,我似乎只BadImageFormatException在以发布模式构建时才得到。

0 投票
2 回答
801 浏览

templates - 托管 C++ 中的非托管 C++ 模板会抛出错误图像?

我有一个托管 C++ dll,它与非托管 C++ dll 动态链接。托管 C++ 从非托管 dll 中的抽象接口派生几个非托管类。

这工作正常。非托管 dll 中的 ICustomer.h

托管 C++ 中的 LocalCustomer.h

LocalCustomer 在托管 dll 中使用。我可以将它传递给非托管 dll 中的函数,并且一切正常。

这是问题所在。当我尝试实现一个公开模板的接口时,我在启动时得到一个 STATUS_INVALID_IMAGE_FORMAT 。

不运行。在非托管 Dll 中

在托管 C++ dll 中

我已经缩小了模板覆盖 GetOrders 的范围。将代码放在托管 dll 中会导致打开一个对话框“应用程序无法正确启动 (0xc000007b),这只是托管加载程序抛出的 STATUS_INVALID_IMAGE_FORMAT HRESULT。删除代码允许它运行。那么模板有什么问题? 为什么我不能在托管的 dll 中使用它。

另一个线索,不确定这是否会分散注意力。我正在编译一个 32 位应用程序并在 Win7 x64 上运行。就像我说的那样,只要模板不跨越 dll 从非托管到托管就可以了。

杀死我的是 II 有几个非托管 C++ 模板,它们完全存在于托管 dll 中,并且工作正常。只是 dll 之间的模板交叉似乎给我带来了不好的形象。

0 投票
1 回答
545 浏览

windows-services - GCC编译的.exe的InstallUtill接收System.BadImageFormatException

我正在尝试使用 GCC 编译的 .exe 作为 Windows 中的服务。根据我的研究,我应该这样做:

虽然当我尝试这样做时,我收到这样的消息:

我有一种感觉,这是因为程序是使用 GCC 编译的,并且确实使用了一些 .a 文件进行编译。

从我所看到的System.BadImageFormatException通常是由某种不良清单引起的。有人可以在这里帮助我吗?