当前位置: 首页 > 编程语言 > C#

为什么我在Vista上能得到DLLnotfound异常,而在XP上却不能?Share

时间:2023-04-10 13:31:50 C#

为什么我在Vista上会出现DLLnotfound异常,而在XP上却不会?我有一个依赖于多个托管库的应用程序。这些托管库又依赖于一些非托管库。当我将应用程序部署到运行XP的计算机时,它工作正常。当我在运行Vista的机器上执行相同操作时,我得到一个DLL未找到异常。我已经尝试部署VS2010安装项目和NSIS安装程序,两者都是相同的。为什么?我该怎么做才能绕过它?更新-更多详细信息两个安装程序都检查.NET4.0安装并在必要时安装Vista机器是64位的,但安装按预期定向到x86ProgramFiles文件夹在这两种情况下,我都有一个管理员帐户DLL保存在据我所知,与可执行文件相同的目录已将文件复制到正确的目录更新2完整错误发生在http://pastebin.ca/2046487DLL是Audiere.Net.dll,它是我的一个,是一个托管库。我不确定该错误是否意味着它找不到Audiere.Net.dll,或者是否因为找不到其依赖项之一而无法加载它。更新3-来自ProcessMonitor的来源在运行ProcessMonitor之后(感谢Mehrdad!),有几个条目没有“SUCCESS”状态。其中一些是“NAMENOTFOUND”,一些是“Pathnotfound”。(它甚至查询PDB文件,我最初认为它只被调试器使用。)很难看出哪些条目可能是导致实际失败的条目。无论如何,我已经上传了日志(针对相关路径进行了过滤)以防对任何人都有意义。更新4-添加.pdb文件所以我有点绝望,并将.pdb文件包含在安装程序的输出中。我不认为它有用,但它实际上会导致更多有用的错误。我现在得到一个BadImageFormatException而不是简单地说DLL未找到。谷歌搜索告诉我,这是在x86上编译但在x64(如Vista机器)上运行的二进制文件的常见问题。建议的补救措施是强制它以x86为目标,但Audiere.Net.dll已经是。它包装的库中有错误吗?也许有某种重定向实际上并没有让你的应用程序安装在目标文件夹中?我们需要更多详细信息,但是您是为用户安装还是为机器安装?你是管理员吗?DLL通常位于何处?编辑:尝试使用ProcessMonitor来监视实际正在访问哪些文件。如果您正在运行.Net应用程序,两台计算机是否都安装了正确的框架?您提到Audiere.Net.dll适用于x86,但是您的可执行文件呢?您显然可以重新编译您的程序或使用Corflags(框架的一部分)来查看您的exe上的当前设置。Corflagsssd2.exe或设置或取消设置标志Corflagsssd2.exe/32BIT+Corflagsssd2.exe/32BIT-(请注意,如果您的应用程序使用强名称签名,除非您使用/Force删除签名,否则它将不起作用)结果证明这个场景非常简单:需要为x64重新编译其中一个非托管DLL。关键步骤:具体细节:通常的原因是有问题的dll依赖于Vista机器上不存在的其他dll(或者可能存在但未注册)。我们遇到了类似的情况,发现我们需要下载c++RedistibuatablePackage才能使用第3方dll在Windows7上运行该程序。我记得遇到过与SQLite包装器类似的问题。问题的根源当然是32/64位问题,SQLite包装器是托管包装器的情况也是如此,这使得它依赖于处理器。我猜你在管理lib(Audiere.Net.dll)时编译为32位,而你的主应用程序(ssd2.exe)不是。安装文件夹由安装程序的配置决定,但如果应用项目没有严格配置编译为x86项目(通常针对默认的AnyCpu环境),无论安装路径如何,应用都会以64位进程启动.这可以通过查看64位机器上任务管理器中的进程轻松验证,所有32位进程在64位Windows机器上都有额外的*32(他们不会在32位机器上使用它)。编辑:或者通过查看项目属性->构建->平台目标会更容易:)无论如何-你应该将构建ssd2.exe的项目的项目设置更改为目标x86,你应该没问题。以上是C#学习教程:为什么在Vista上能找到DLLnotfound异常,在XP上却找不到?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: