无法加载dll文件 - 异常0x8007007E

3
我正在使用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。

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

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

  • 我已通过Windows更新确保涉及计算机的.net框架已更新。

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

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

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

    “尝试加载具有不正确格式的程序。 (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。

我已经想不出还能尝试什么来解决这个问题了,这个问题与IT技术有关。
2个回答

9
我怀疑即使此次设置是针对X86,该项目本身也是AnyCPU的,因此在64位系统上作为64位进程运行,在32位系统上作为32位进程运行。由于您说您的DLL位于Program Files(x86)文件夹中,我假设它只能是32位的,因此您应该将应用程序编译为x86。这是您第7个要点得出的结论。
仅仅复制nianlys.dll 64位DLL似乎不能正常工作,因为它似乎依赖于其他无法找到的DLL(要点#8)。

太好了!终于解决了问题。自从上周四以来,我一直在寻找解决方案,但没有取得多少进展。我原以为将设置项目目标设置为x86会使程序以32位运行 - 我没有意识到还有一个单独的设置来控制这个。谢谢! - user2823789
很高兴能帮助到你 :-D - Thorsten Dittmar
1
啊,好的。所以即使这个答案不仅是被接受的答案,而且OP还评论说它解决了他的问题,但它仍然被踩了? - Thorsten Dittmar

3
可能是由于nianlys.dll的依赖项未找到所致。您可以使用系统内部工具之一进程监视器来诊断此问题。它可以捕获加载/卸载DLL活动,因此如果出现问题,您可以在日志中找到它。
使用此工具时,请务必使用过滤器,否则日志文件将非常大。

谢谢,进程监视器非常有帮助。我发现我的本地DLL正在尝试查找Microsoft C运行时“msvcr120.dll”。 - opewix
在进程监视器上过滤您的应用程序,您将能够找到系统中无法找到的DLL。这对我也起了作用! - rajkumaradass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接