【问题标题】:Unable to load dll file - exception 0x8007007E无法加载 dll 文件 - 异常 0x8007007E
【发布时间】:2014-01-27 14:59:14
【问题描述】:

我正在使用 C# 中的 National Instruments Measurement Studio,在将我的应用程序部署到特定计算机(运行 Windows 7)时遇到了一些问题。我已经尝试在 National Instruments 论坛上提问,但还没有任何解决方案 - 这里有人可以给我一些提示吗?

基本上,我已在多台计算机上多次部署此应用程序,但在这种特殊情况下,我在运行程序时收到错误 -

“System.DllNotFoundException:无法加载 DLL 'nianlys.dll':找不到指定的模块。(来自 HRESULT 的异常:0x80070007E)

  • 我已确保 nianlys.dll 存在于 C:\Program Files (x86)\National Instruments\Shared\Analysis。

  • 我已确保存在 libiomp5md.dll 和 LV110000_BLASLAPACK.dll,来自 mkl.msm 的文件(nianlys.dll 依赖于 mkl.msm)。 nianlys.dll 还依赖于 nimetautils.msm,但我不确定其中包含哪些 dll。

  • 我已通过以管理员身份运行 setup.exe 确保程序已安装(而不是运行生成的 .msi,请参阅here)。

  • 我已确保有问题的计算机是最新的,通过 Windows 更新对 .net 框架进行了更新。

  • 我曾多次尝试重新安装程序,有时使用重新编译的安装程序。

  • 我已尝试将 64 位 nianlys.msm 手动添加到安装项目中 - 这会引发错误,因为安装项目的 TargetPlatform 属性设置为 x86。当然,检测到的依赖项中已经存在 32 位版本。

  • 有趣的是,从 C:\Program Files (x86)\National Instruments\Shared\Analysis 获取 nianlys.dll 的副本并将其插入到程序安装的目录中会引发不同的错误 - 在这种情况下,错误是:

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

  • 从另一台计算机(默认位置 C:\Program Files\National Instruments\Shared\Analysis)复制 64 位版本的 nianlys.dll 并将其插入到程序安装目录中第三种错误 - “System.DllNotFoundException:无法加载 DLL 'nianlys.dll':动态链接库 (DLL) 初始化例程失败。(来自 HRESULT 的异常:0x8007045A)”。应该注意的是,这个 .dll 在将程序安装到程序运行的机器上之前就存在,但存在于引发问题的目标计算机上。

    李>
  • 将相同的 64 位 nianlys.dll 插入到在另一台计算机上找到的位置 C:\Program Files\National Instruments\Shared\Analysis 中,并不能解决原始错误。

  • 更有趣的是,我试图在程序运行的计算机上重现该错误 - 删除 x64 版本的 nianlys.dll 会引发原始 HRESULT: 0x80070007E 错误,而删除 x86 版本会导致运行程序时出现的 windows 安装程序。

  • 在程序正常运行的计算机上,Windows 任务管理器似乎没有指示程序是 32 位的(程序名称带有 *32 后缀),尽管目标平台是设置为 x86。从这一切看来,nianlys.dll 在其 x64 和 x86 版本中都存在一些问题,尽管目标平台仅为 x86。

我想尽办法解决这个问题。

【问题讨论】:

    标签: c# .net dll


    【解决方案1】:

    我怀疑即使 setup 是针对 X86 的,但项目本身是 AnyCPU,因此在 64 位系统上作为 64 位进程运行,在 32 位系统上作为 32 位进程运行系统。正如您所说,您的 DLL 位于 Program Files (x86) 文件夹中,我假设它只是 32 位的,因此您也应该将应用程序显式编译为 x86。正是你的第 7 条子弹让我得出了这个结论。

    仅复制nianlys.dll 64 位 DLL 似乎不起作用,因为它似乎依赖于它无法找到的其他 DLL。 (第 8 条)。

    【讨论】:

    • 是的!最后!谢谢,这解决了问题。自上周四以来,我一直在寻找解决此问题的方法,但并没有取得太大进展。我假设将设置项目目标设置为 x86 会导致程序以 32 位运行 - 我没有意识到还有一个单独的设置可以控制这一点。
    • 很高兴我能帮上忙:-D
    • 啊,好的。所以这个答案被否决了,即使它不仅是公认的答案,而且 OP 评论说它解决了他的问题?
    【解决方案2】:

    可能是没有找到nianlys.dll的依赖项造成的。您可以使用系统内部工具之一the process monitor 诊断此问题。它可以捕获加载/卸载 DLL 活动,因此如果出现问题,您可以在日志中找到它。

    使用此工具时一定要使用过滤器,否则日志文件会很大。

    【讨论】:

    • 谢谢,Process Monitor 很有帮助。我发现我的原生 DLL 正在尝试查找 Microsoft C 运行时“msvcr120.dll”。
    • 在进程监视器上过滤您的应用程序,您将能够找到在您的系统中无法找到的 DLL。它也对我有用!
    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多