【发布时间】: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 加载。