【问题标题】:AutoIt (AutoItX) on C# Windows 7 App System.DllNotFoundExceptionC# Windows 7 应用 System.DllNotFoundException 上的 AutoIt (AutoItX)
【发布时间】:2015-10-03 01:04:31
【问题描述】:

我有一个使用 AutoItX 进行自动化的 C# 应用程序。此应用程序在我使用 Microsoft Visual Studio 2013 第 3 版编译的 Windows 8.1 x64 环境中运行良好。

我将应用程序代码的副本推送到 bitbucket 存储库,并将其克隆到运行 Windows 7 x64 的计算机上。 AutoItX 版本 3.14.2 已安装并选择了 32 位调用。该应用程序是使用 Visual Studio 2013 版本 4 编译的。

应用编译正常,但第一次使用 AutoIt 功能导致错误:

An unhandled exception of type 'System.DllNotFoundException' occurred in AutoItX3.Assembly.dll

我尝试了以下步骤。在每个步骤之后都对应用进行了测试

  1. 尝试使用 regsrv32 手动注册 .dll

    regsrv32 "C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll"

  2. 卸载 VisualStudio 2013 R4 并尝试重新安装 VisualStudio 2013 R3 {R3 安装失败,因为它需要 Internet Explorer 版本 10 并且此计算机上已安装版本 11},因此重新安装了 R4

  3. 卸载 AutoIt 并重新安装,选择 64 位库首选项。使用 x64 平台选项编译应用程序

  4. 卸载 AutoIt 并使用 32 位库首选项重新安装 使用 X86 平台选项编译应用程序

  5. 手动将AutoItX3.dll复制到C:\windows\System32目录

  6. 手动将 AutoItX3_x64.dll 复制到 c:\Windows\SysWOW64 目录。为 x64 平台编译应用程序

  7. 清除计算机并重新安装 Windows 7、AutoIt(32 位首选项)、Visual Studio 2013 R4

  8. 已安装 AutoIt v14

  9. 安装了 AutoIt v15 测试版

  10. 执行 Windows 更新 - 已安装 213 个更新 (!)

  11. 已安装 Internet Explorer v11

  12. 执行 Windows 更新 - 已安装 4 个更新

  13. 安装了适用于 Windows 8 系统的 AutoIt 3.10.2 版

我会很感激有关下一步尝试的建议。我可能遗漏了一些非常基本的东西,但我找不到解决方案

【问题讨论】:

  • 我必须说你提出了我在 SO 上见过的最好的精心设计的问题之一。我会得到 Dependency Walker(谷歌)并在AutoItX3.Assembly.dll 上使用它。它应该列出所有需要的 dll,并告诉您缺少哪些。
  • 感谢史蒂夫的建议。我下载了 Dependency Walker。 AutoItX.dll 和 AutoItX.Assembly 都显示了许多丢失的依赖文件……大约有十几个 AutoItX.dll。我不确定从哪里开始添加那些缺少的依赖项。我进行了 Windows 更新并进行了 213(!)次更新。该应用程序仍然失败。我安装了IE11。该应用程序仍然失败。我希望我不需要单独寻找和安装每个 dll。 AutoIt 与 windows 7 不兼容吗?
  • @Darwinlcesurfer - 我认为您可以将所有 DLL 复制到可执行文件的目录中,它们就会被找到。
  • 我尝试安装与 Windows 8.1 系统 (3.10.2) 相同版本的 AutoIt。结果相同。 Dependency walker 显示 9 个文件的缺失文件,包括 DCOMP.DLL 和 GPSVC.DLL。这很奇怪,因为 gpsvc.dll 可以在 C:\windows\System32 中找到。我还做了 4 次 Windows 更新。
  • @Darwinlcesurfer 你可能已经检查过了,但是....你没有混淆 32 位和 64 位版本,是吗?版本号看起来正确,但动态链接将失败。

标签: c# dll automation autoit-c#-wrapper


【解决方案1】:
  1. 手动将AutoItX3.dll复制到C:\windows\System32目录

  2. 手动将 AutoItX3_x64.dll 复制到 c:\Windows\SysWOW64 目录。为 x64 平台编译应用程序

这是你唯一做错的一件事,你把副本颠倒了。您不会缺少其他 DLL,AutoItX3.dll 和 AutoItX3_x64.dll 文件本身没有任何 Windows 机器上尚不可用的其他依赖项。只是操作系统 DLL,它们一直存在。您可以通过 Dumpbin.exe /imports 看到一些东西。

异常消息来自 .NET,它是由 [DllImport] 属性引起的。您可以使用 ILSpy 或 Reflector 等反编译器查看 AutoItX3.Assembly.dll 的内容。它很少,只有两个 DLL 被使用过。 AutoItX3.dll 用于 32 位代码,AutoIt_x64.dll 用于 64 位代码。

顺便说一句,相当悲惨,否则是 ab/使用非操作系统 DLL 的操作系统目录的副作用。了解为什么会出现倒退的唯一真正方法是了解 Windows 的历史。

早在 Windows 还是 16 位操作系统(版本 1 到 3.11)的早期,c:\windows\system 是操作系统可执行文件的主目录。从 NT 3.11 和 Windows 95(第一个 32 位版本)开始,该目录被重命名为 c:\windows\system32。当 64 位版本可用时,Microsoft 无法再将其重命名为 c:\windows\system64。太多的程序在其源代码中硬编码了该目录的名称。打破这些程序本来是一个好主意,但不是让客户迁移到下一个版本的好策略。

64位版本有一个可以运行32位程序的模拟器,叫WOW64。 “64 位 Windows 上的 Windows”。因此,c:\windows\syswow64 目录是 32 位可执行文件的主目录。

与名称所暗示的完全相反。只需反转副本,运行时错误就会消失。


一般建议适用:

  • 让加载程序告诉您缺少 DLL 的官方方法是 enable loader snaps。这是最可靠的方法,虽然有点笨拙。
  • Dependency Walker 很久没有维护了,并且产生了太多的错误警告。像这样的 .NET 程序也有问题,它看不到对 AutoItX3.dll 的依赖。当您使用其配置文件模式时,您仍然应该从中获得一些东西。
  • Process Monitor 始终是解决缺失 DLL 问题的最佳工具。您将看到您的程序正在搜索丢失的 DLL,您可以从跟踪中得知它的名称和查找的目录。从底部附近开始向后工作,以避免淹没在数据中。但是我应该注意,它最近在我使用的机器上不可靠,因为 ~Win81,跟踪只是缺少我知道应该在那里的东西。 YMMV。

【讨论】:

  • 非常值得赏金!我只是将 32 位 dll 复制到 SYSWOW64 并且它工作正常!谢谢,答案标记为已接受。
【解决方案2】:

此类问题可能是由缺少 DLL 或缺少 DLL 的依赖关系引起的。我在使用 Dependency Walker 时从来没有得到好的结果,但我已经使用 Process Monitor 成功追踪了此类问题。

这不应该是直接的 32/64 位问题,因为这会导致 BadImageFormatException 代替。

您可以像这样调试缺少的 DLL 问题:

  1. 开始Process Monitor
  2. 为您的可执行文件设置过滤器
  3. 重现问题(即运行您的应用程序)
  4. 以 XML 文件格式保存日志
  5. Process Monitor Log Analyzer 中打开 XML(免责声明:我是该免费工具的作者)
  6. 自上而下检查确实缺少哪个 DLL。可能有一些程序可以正常降级,因此并非所有这些都是必需的。

【讨论】:

  • 抱歉,顺便说一句,回答迟了。我希望我早点找到它。
【解决方案3】:

短解决方案

将 AutoItX3.dll 文件复制并粘贴到 /bin/Debug/bin/Release 文件夹。

项目解决方案

你可以做的是放入项目的Post-build event命令行:

copy /Y "$(SolutionDir)\packages\AutoItX.3.3.12.0\AutoItX3.dll" "$(ProjectDir)\bin\Debug" 

 

copy /Y "$(SolutionDir)\packages\AutoItX.3.3.12.0\AutoItX3.dll" "$(ProjectDir)\bin\Release"

【讨论】:

  • 你能排版这个答案吗,很难按原样阅读?
  • 放入项目的构建后事件命令行:复制 /Y "$(SolutionDir)\packages\AutoItX.3.3.12.0\AutoItX3.dll" "$(ProjectDir)\bin\Debug "
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2011-08-31
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
相关资源
最近更新 更多