【问题标题】:Could not load file or assembly exception无法加载文件或程序集异常
【发布时间】:2012-03-14 05:36:03
【问题描述】:

对可能导致此异常的原因有什么想法吗?

我有一个网络服务项目,当我加载我得到的链接时

无法加载文件或程序集“Interop.DIB”或其依赖项之一。试图加载格式不正确的程序。
异常详细信息:System.BadImageFormatException:无法加载文件或程序集“Interop.DIB”或其依赖项之一。试图加载格式不正确的程序。

内部异常:

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

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

[HttpException (0x80004005): 无法加载文件或程序集“Interop.DIB”或其依赖项之一。试图加载格式不正确的程序。]

版本信息:
Microsoft .NET 框架版本:4.0.30319; ASP.NET 版本:4.0.30319.272

【问题讨论】:

标签: c# web-services


【解决方案1】:

如果我不得不猜测,要么是 a) 没有找到互操作程序集,要么 b) COM DLL 未在本地注册表中注册。当你在玩 COM 时,仅仅将 DIB 复制到 /bin 文件夹是不够的。

我相信 (B) 是对正在发生的事情最有可能的答案。

【讨论】:

    【解决方案2】:

    好的,答案是 Got to Start->Run->type inetmgr 并在左侧应用程序池中,选择 DefaultAppPool 和应用程序的虚拟目录名称,并确保将 32 位应用程序启用为 true,我正在使用IIS7.0 和 windows 7 64 位。

    【讨论】:

    • 哇,感谢上帝的回答。我希望错误消息会引用具体导致错误的策略/属性。很高兴听到我的 dll 格式不正确,因为 IIS 被设置为不允许 32 位应用程序,因此只需要 64 位组件
    • 看来你让我开心了,因为 x64 机器上的新应用程序池默认情况下不适用于 x32 dll
    • 奇怪的是,默认的 ASP.NET 4.0 应用程序池设置为不允许 32 位应用程序。无论如何,谢谢,这为我解决了这个问题!
    • 嘿...你能告诉我们什么时候可以“确保启用 32 位应用程序为真”吗?
    • @Sharpeye500 在我遇到的所有问题之后,这是我面临的最后一个问题,解决这个问题已经启动了我的网络服务..非常感谢..
    【解决方案3】:

    根据我的经验,最常见的原因是您对引用的程序集进行了更改,需要使用该更改的程序集重新构建其他程序集,但没有重新构建它们。

    示例 #1:您有一个引用 DLL 的 EXE。您向引用的 DLL 添加一些内容,添加新方法、新参数等。这会改变 DLL 的外部“签名”;也就是各个入口点在内存中的位置。你不重建EXE。当 EXE 加载并尝试引用新的 DLL 时,其旧入口点不再有效,因此无法执行所需的代码。

    示例 #2:您有一个引用 DLL 的 x86 EXE。此 DLL 还必须针对 x86(或任何 CPU)进行编译。如果你为 x64 重新构建它,运行在 32 位空间中的 EXE 将无法理解 64 位“扩展”世界的指令和寄存器引用,并且会哭泣。

    【讨论】:

      【解决方案4】:

      BadImageFormatException 通常表示 64 与 32 位冲突。其中一个程序集设置为 特定平台,即 64 位或 32 位,而另一个程序集设置或默认为不同的。检查两个程序集是否适用于同一平台,最好是“任何 CPU”。换句话说,可能是 64 位程序集试图加载 32 位程序集,反之亦然。

      如果您正在调用为不同平台编译的 COM 或 DLL,这也适用,例如,您从 64 位系统上的程序集调用 32 位 COM/DLL,其中程序集的平台默认为 x64。在这种情况下,请调整您的程序集平台以匹配。

      要更改平台,请转到项目属性 -> 构建 -> 平台。

      【讨论】:

        【解决方案5】:

        对我有用的是将程序集添加到 GAC。为此,我从 Visual Studio 命令提示符运行 gacutil -i PATH_TO_ASSEMBLY

        【讨论】:

        • 更新:同样有效的是使用 AppDomain.CurrentDomain.BaseDirectory 找出应用程序域并将程序集复制到那里
        【解决方案6】:

        我终于通过删除 IIS Express 的 applicationhost.config 中的条目 (C:\Users{username}\Documents\IISExpress\config\applicationhost.config) 解决了这个异常。

        我还停止了 IIS express 实例,在 VS 中清理和重建。然后更改配置文件,然后重新启动VS 2013。

        【讨论】:

          【解决方案7】:

          此问题的替代方法是更改​​项目的构建属性。

          对于 vb.net 到 Project--> Properties --> Compile --> Advanced Compile Options 这里更改目标CPU

          【讨论】:

            【解决方案8】:

            我在 Windows 10 x64 上的 Visual Studio 2015 上遇到了同样的问题。我已经在任何 CPU 模式下编译。这是一个默认的 MVC4 应用程序(没有添加)。我在这里找到了一个对我有用的简单解决方案: https://github.com/aspnet/Home/issues/524

            在 VS 2015 中: 工具 > 选项 > 项目和解决方案 > Web 项目 > 为网站和项目使用 64 位版本的 IIS Express

            【讨论】:

              【解决方案9】:

              我在 Visual Studio 2013 中尝试在我的 ASP.Net 项目中使用 64 位 .dll 时遇到了这个问题。

              解决方案是点击Tools\Options,然后勾选此框:

              【讨论】:

              • 那个指针。惊人的。您是手动完成的还是来自某些屏幕截图应用程序?
              • 哈哈!!我在网上的某个地方找到了它,并经常在我的 StackOverflow 文章中使用它来为一些看起来很无聊的图像加油!!
              • 手指太酷了。但对我来说,答案只是重建解决方案..
              【解决方案10】:

              对我有用的是在我的机器上进行 BIOS 更新!

              【讨论】:

                【解决方案11】:

                这对我有用,如果不适合你,请不要投反对票。不礼貌

                因此,如果我将 c# 项目从 Any CPU 更改为 x86(所有 dll 在 WIN32 中编译)从属性 -> 构建 -> 平台目标。一世 在 64 位 Win7 电脑上工作,如果我使用任何 CPU 作为目标 找不到包装 dll。

                https://www.codeproject.com/Questions/358717/Could-not-load-file-or-assembly-dll-file
                

                【讨论】:

                  【解决方案12】:

                  我的错误已修复,构建选项更改为:

                  在我的 C#.net win 项目中:

                  属性>构建>平台目标>'x86'

                  我不小心将它的值更改为“任何 CPU”而忘记更改它。

                  【讨论】:

                    【解决方案13】:

                    我的错误已修复,构建选项更改为:

                    在我的C#.netwin 项目中:

                    Properties > Build > Platform Target > 'x86'
                    

                    我不小心将它的值更改为“任何 CPU”而忘记更改它。

                    这对我有用

                    【讨论】:

                    • 这似乎是来自@Zolfaghari 的答案的直接复制和粘贴。
                    【解决方案14】:

                    Visual Studio 2022 开始出现此错误。

                    我的项目设置为 AnyCPU,但有些 dll 编译为 x86,我无法更改它,因为我没有源代码。在以前版本的 VS 中,该项目可以正常工作。

                    我意识到在以前的 Visual Studio 版本(例如 2019 版)中,默认 IIS 是在 x86 上运行(毕竟它也是 x86 进程),如您在此处看到的:

                    但在 VS 2022 中,默认情况下会选中此选项。

                    解决方案:

                    第一个解决方案取消选中选项 -> 项目和解决方案中的“为网站和项目使用 64 位版本的 IIS Express”选项。 p>

                    但这会改变所有项目的 IIS Express 版本。

                    第二种解决方案是仅为该解决方案更改 IIS Express(我更喜欢这样做,因为我的大多数项目都没有特定的已编译 dll)

                    1- 转到解决方案属性-> Web,在服务器部分将位数更改为 x86:

                    结论

                    最好的解决方案是将所有 dll 编译到同一个平台(x86、x64、AnyCPU 等),但如果你像我一样无法做到,这将为你解决。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-06-29
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多