【问题标题】:x64 x86 DLL AnyCPUx64 x86 DLL AnyCPU
【发布时间】:2014-08-15 16:09:57
【问题描述】:

我正在尝试使用EasyHook 挂钩一个简单的进程。我正在 x64 环境中编程/调试,并在 Visual Studio C# 上使用 AnyCpu 配置编译我的 DLL。

问题是当尝试在注入库函数中使用这个 DLL(在另一个项目中,相同的解决方案,也使用 AnyCpu 编译)时:

RemoteHooking.Inject(TargetPID, "DivisionInject.dll", "DivisionInject.dll", ChannelName); (第 2 个参数是 32 位系统,第 3 个是 64 位系统。)

我不知道为什么这行会抛出异常: System.ArgumentException:给定的 64 位库不存在!

我认为 AnyCpu 用于创建我的 DLL,我可以在 32 位系统和 64 位系统中使用相同的文件 (DLL)。这是错的吗?

谢谢。

【问题讨论】:

  • 是的,这是错误的。可供使用的版本将是正在使用它的进程的版本(32 位用于 32 位进程,64 位用于 64 位进程)。在同一执行(运行)期间,您不能同时拥有 32 位和 64 位的单个进程,因此只能从该进程加载一个版本的 DLL。
  • 这不仅仅是一个简单的“找不到文件”错误吗?使用 SysInternals 的 Process Monitor 找出它的位置。或者使用 DLL 的完整路径名,这样就不必猜测了。
  • 不。它不是找不到文件错误。问题是,“DivisionInject.dll”是用 AnyCpu 编译的。并且可执行文件也被编译。如果“DivisionInject.dll”应该在执行时作为 64 位 dll 加载,它怎么可能抛出这个异常。 (我在 64 位环境中)。我在 DLL 上使用了 DUMPBIN,它显示在 HEADER 值“机器(x86)”上。这是否意味着这只是一个 32 位的 dll?这可以解释问题,但是当我使用 AnyCpu 时,我认为它可以在 64 位环境中作为 64 位 dll 加载。

标签: c# dll hook


【解决方案1】:

AnyCpu 设置基本上意味着进程或库将如何加载或执行的确定将基于/基于执行/加载点。编译为 AnyCpu 的库将可由 32 位和 64 位调用进程加载。编译为 AnyCpu 的可执行文件将在 64 位机器上运行 64 位进程,在 32 位机器上运行 32 位进程。有关 AnyCpu 目标概念的讨论,请参见 this 线程。

如果您的调用程序编译为 64 位并设置为 AnyCpu,它将尝试加载 64 位库。

【讨论】:

  • 感谢您的回答。我的调用者(在同一解决方案中)在 64 位环境中编译并设置为 AnyCpu。我认为它试图加载 64 位库。那也恰好被编译为 AnyCpu。我不知道为什么它会抛出那个异常。 dll是一样的=/
  • 您遇到的文件未找到错误可能是路径问题。也许通过反射检查程序集的工作路径并验证依赖程序集是否存在。
【解决方案2】:

虽然现在不太常见,但可以在 64 位计算机上安装 Windows 32 位。在这种情况下,只有为 32 位/AnyCpu 构建的 exe 才能运行。反之亦然。 32 位机器只能运行 Windows 32 位。 因此,O/S 位数是决定因素,而不是硬件。

64 位机器上的 Windows 32 位在企业商店中更为常见,他们不想同时支持在 Windows-64 上运行的操作系统或 32 位旧版应用程序。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 2017-08-03
    • 2013-07-19
    • 1970-01-01
    • 2017-04-28
    • 2016-01-12
    • 2015-05-03
    • 1970-01-01
    相关资源
    最近更新 更多