C# Windows 7 应用程序 System.DllNotFoundException 上的 AutoIt (AutoItX)

Dar*_*fer 5 c# dll automation autoit-c#-wrapper

我有一个使用 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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下步骤。该应用程序在每个步骤后都经过测试

  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 版

我将不胜感激有关下一步尝试的建议。我可能缺少一些非常基本的东西,但我找不到解决方案

Han*_*ant 2

  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 位版本可用时,微软无法再将其重命名为 c:\windows\system64。太多的程序在源代码中硬编码了该目录的名称。破坏这些程序是一个好主意,但不是让客户转向下一个版本的好策略。

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

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


一般建议适用:

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