C# 上的 AutoIt (AutoItX) Windows 7 个应用 System.DllNotFoundException
AutoIt (AutoItX) on C# Windows 7 App System.DllNotFoundException
我有一个使用 AutoItX 实现自动化的 C# 应用程序。此应用程序在我的 Windows 8.1 x64 环境中运行良好,使用 Microsoft Visual Studio 2013 release 3.
我将应用程序代码的副本推送到 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
我尝试了以下步骤。该应用在每个步骤后都经过了测试
尝试使用 regsrv32 手动注册 .dll
regsrv32 "C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll"
已卸载 VisualStudio 2013 R4 并尝试重新安装 VisualStudio 2013 R3 {安装 R3 失败,因为它需要 Internet Explorer 版本 10,而版本 11 已安装在此计算机上}因此重新安装了 R4
卸载 AutoIt 并选择 64 位库首选项重新安装。使用 x64 平台选项编译应用程序
已卸载 AutoIt 并使用 32 位库首选项重新安装
使用 X86 平台选项编译应用程序
手动复制AutoItX3.dll到C:\windows\System32目录
手动复制AutoItX3_x64.dll到c:\Windows\SysWOW64目录。为 x64 平台编译应用
清除计算机并重新安装 windows 7、AutoIt(32 位偏好)、Visual Studio 2013 R4
已安装 AutoIt v14
安装了 AutoIt v15 测试版
执行了 Windows 更新 - 安装了 213 个更新 (!)
已安装 Internet Explorer v11
执行了 Windows 更新 - 安装了 4 个更新
已安装可在 Windows 8 系统上运行的 AutoIt 版本 3.10.2
我将不胜感激有关下一步尝试的建议。我可能遗漏了一些非常基本的东西,但我就是找不到解决方案
此类问题可能是由缺少 DLL 或缺少 DLL 的依赖项引起的。我从来没有用 Dependency Walker 得到好的结果,但我已经用 Process Monitor 成功地找到了这样的问题。
它不应该直接是 32/64 位问题,因为那会导致 BadImageFormatException
。
您可以像这样调试丢失的 DLL 问题:
- 开始Process Monitor
- 为您的可执行文件设置过滤器
- 重现问题(即 运行 您的申请)
- 以XML文件格式保存日志
- 在Process Monitor Log Analyzer中打开XML(免责声明:我是该免费工具的作者)
- 从上往下检查到底是哪个DLL丢失了。程序可能在某些地方可以优雅地降级,因此不一定需要所有这些。
Manually copied AutoItX3.dll to the C:\windows\System32 directory
Manually copied AutoItX3_x64.dll to the c:\Windows\SysWOW64 directory. Compiled the app for x64 platform
这是你唯一做错的地方,你把副本弄反了。没有其他您可能会丢失的 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/using 操作系统目录对非操作系统 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。 “Windows 64 位 Windows”。因此,c:\windows\syswow64 目录是 32 位可执行文件的主目录。
与名字所暗示的完全相反。只需反转副本,运行时间错误就会消失。
通用建议适用:
- 让加载程序告诉您缺少 DLL 的官方方法是 enable loader snaps。这是最可靠的方法,虽然有点笨拙。
- Dependency Walker 已经很长时间没有维护了,并且产生了太多的错误警告。 .NET 程序也有这样的问题,它看不到对 AutoItX3.dll 的依赖。当您使用它的配置文件模式时,您仍然应该从中得到一些东西。
- Process Monitor 始终是对丢失的 DLL 进行故障排除的最佳工具。您会看到您的程序正在搜索丢失的 DLL,您可以从跟踪中知道它的名称和它查找的目录。从靠近底部开始向后工作,以避免淹没在数据中。但是,我应该注意,自从 ~Win81 以来,它最近在我使用的机器上不可靠,跟踪只是缺少我知道应该存在的东西。 YMMV.
简短的解决方案
将 AutoItX3.dll 文件复制并粘贴到 /bin/Debug
或 /bin/Release
文件夹。
项目解决方案
你可以做的是在项目的Post-build事件命令行中输入:
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"
我有一个使用 AutoItX 实现自动化的 C# 应用程序。此应用程序在我的 Windows 8.1 x64 环境中运行良好,使用 Microsoft Visual Studio 2013 release 3.
我将应用程序代码的副本推送到 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
我尝试了以下步骤。该应用在每个步骤后都经过了测试
尝试使用 regsrv32 手动注册 .dll
regsrv32 "C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll"
已卸载 VisualStudio 2013 R4 并尝试重新安装 VisualStudio 2013 R3 {安装 R3 失败,因为它需要 Internet Explorer 版本 10,而版本 11 已安装在此计算机上}因此重新安装了 R4
卸载 AutoIt 并选择 64 位库首选项重新安装。使用 x64 平台选项编译应用程序
已卸载 AutoIt 并使用 32 位库首选项重新安装 使用 X86 平台选项编译应用程序
手动复制AutoItX3.dll到C:\windows\System32目录
手动复制AutoItX3_x64.dll到c:\Windows\SysWOW64目录。为 x64 平台编译应用
清除计算机并重新安装 windows 7、AutoIt(32 位偏好)、Visual Studio 2013 R4
已安装 AutoIt v14
安装了 AutoIt v15 测试版
执行了 Windows 更新 - 安装了 213 个更新 (!)
已安装 Internet Explorer v11
执行了 Windows 更新 - 安装了 4 个更新
已安装可在 Windows 8 系统上运行的 AutoIt 版本 3.10.2
我将不胜感激有关下一步尝试的建议。我可能遗漏了一些非常基本的东西,但我就是找不到解决方案
此类问题可能是由缺少 DLL 或缺少 DLL 的依赖项引起的。我从来没有用 Dependency Walker 得到好的结果,但我已经用 Process Monitor 成功地找到了这样的问题。
它不应该直接是 32/64 位问题,因为那会导致 BadImageFormatException
。
您可以像这样调试丢失的 DLL 问题:
- 开始Process Monitor
- 为您的可执行文件设置过滤器
- 重现问题(即 运行 您的申请)
- 以XML文件格式保存日志
- 在Process Monitor Log Analyzer中打开XML(免责声明:我是该免费工具的作者)
- 从上往下检查到底是哪个DLL丢失了。程序可能在某些地方可以优雅地降级,因此不一定需要所有这些。
Manually copied AutoItX3.dll to the C:\windows\System32 directory
Manually copied AutoItX3_x64.dll to the c:\Windows\SysWOW64 directory. Compiled the app for x64 platform
这是你唯一做错的地方,你把副本弄反了。没有其他您可能会丢失的 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/using 操作系统目录对非操作系统 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。 “Windows 64 位 Windows”。因此,c:\windows\syswow64 目录是 32 位可执行文件的主目录。
与名字所暗示的完全相反。只需反转副本,运行时间错误就会消失。
通用建议适用:
- 让加载程序告诉您缺少 DLL 的官方方法是 enable loader snaps。这是最可靠的方法,虽然有点笨拙。
- Dependency Walker 已经很长时间没有维护了,并且产生了太多的错误警告。 .NET 程序也有这样的问题,它看不到对 AutoItX3.dll 的依赖。当您使用它的配置文件模式时,您仍然应该从中得到一些东西。
- Process Monitor 始终是对丢失的 DLL 进行故障排除的最佳工具。您会看到您的程序正在搜索丢失的 DLL,您可以从跟踪中知道它的名称和它查找的目录。从靠近底部开始向后工作,以避免淹没在数据中。但是,我应该注意,自从 ~Win81 以来,它最近在我使用的机器上不可靠,跟踪只是缺少我知道应该存在的东西。 YMMV.
简短的解决方案
将 AutoItX3.dll 文件复制并粘贴到 /bin/Debug
或 /bin/Release
文件夹。
项目解决方案
你可以做的是在项目的Post-build事件命令行中输入:
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"