我有一个依赖于多个托管库的应用程序。这些托管库反过来依赖于一些非托管库。
当我将应用程序部署到运行XP的计算机时,它运行正常。当我在运行Vista的机器上执行相同操作时,我得到一个未找到DLL的异常。
我已经尝试过VS2010安装项目和NSIS安装程序来进行部署,两种情况都是一样的。
为什么会发生这种情况?我该怎么做才能解决它?
更新 - 更多详情
更新2
我不确定该错误是否意味着它无法找到Audiere.Net.dll,或者它是否无法加载它,因为无法找到其中一个依赖项。
更新3 - 来自Process Monitor的资料
运行进程监视器后(感谢Mehrdad!),有几个条目没有“SUCCESS”状态。其中一些是“NAME NOT FOUND”,有些是“未找到路径”。 (它甚至查询PDB文件,我原本认为它只是由调试器使用。)很难看出哪些条目可能是导致实际失败的条目。无论如何,我uploaded the log(过滤了相关路径)以防万一对任何人都有意义。
更新4 - 添加.pdb文件
所以我有点绝望,并将.pdb文件包含在安装程序的输出中。我认为它没用,但它实际上导致了更有用的错误。我现在得到一个BadImageFormatException而不是简单地说找不到DLL。谷歌搜索告诉我,这是在x86上编译但在x64上运行的二进制文件的常见问题(就像Vista机器一样)。
建议的补救措施是强制它以x86为目标,但Audiere.Net.dll已经是。问题可能在于它包装的库吗?
答案 0 :(得分:2)
也许有某种重定向,实际上并没有让你的应用安装在目标文件夹中?
我们需要更多详细信息,但您是在为用户还是机器安装?你是管理员吗? DLL通常位于何处?
修改:尝试使用Process Monitor来监控实际访问的文件。
答案 1 :(得分:1)
如果您运行的是.Net应用程序,那么两台计算机都安装了正确的Framework吗?
答案 2 :(得分:1)
你提到Audiere.Net.dll是针对x86的,但是你的可执行文件呢?
您显然可以重新编译程序或使用Corflags(框架的一部分)来查看exe上的当前设置。
Corflags ssd2.exe
或者设置或取消设置标志
Corflags ssd2.exe /32BIT+
Corflags ssd2.exe /32BIT-
(请注意,如果您的应用使用强名称进行签名,除非您使用/强制删除签名,否则它将无效)
答案 3 :(得分:1)
解决方案结果非常简单:需要为x64重新编译其中一个非托管DLL。
关键步骤:
BadImageFormatException
)<强>具体细节:强>
Audiere.Net.dll
有关,但实际上是由libaudieresharpglue.dll
的问题引起的。答案 4 :(得分:0)
通常的原因是有问题的dll取决于Vista机器上没有的其他dll(或者可能在那里但没有注册。)
答案 5 :(得分:0)
我们碰到了类似的东西,发现我们需要下载c++ Redistibuatable Package以使用第三方dll在Windows 7上运行该程序。
答案 6 :(得分:0)
我记得在SQLite包装器中遇到了类似的问题。 问题的根源当然是32/64位问题,并且它与SQLite包装器是托管包装器的情况相同,这使得它依赖于处理器。
我猜你在管理lib(Audiere.Net.dll)时编译为32位,你的主应用程序(ssd2.exe)不。
安装文件夹由安装程序的配置决定,但如果应用程序项目没有严格配置为编译为x86项目(通常针对默认的任何Cpu 环境),那么应用程序将无论安装路径如何,都以64位进程启动。通过在64位计算机上查看任务管理器中的进程可以轻松验证这一点,所有32位进程在64位Windows机器上都有额外的* 32(它们不会在32位计算机上使用它)。
编辑:或者通过查看项目属性更轻松 - &gt;构建 - &gt;平台目标:)
无论如何 - 您应该将构建ssd2.exe的项目的项目设置更改为目标x86,您应该没问题。