我刚刚编写了一个 .NET 分析器(CLR 将使用的 DLL)。实际上,该 DLL 可在 Windows XP 上使用专为应用程序设计的Any CPU
应用Win32
程序。但是,在 Windows 7 x64 上,它仅适用于为x86
体系结构设计的应用程序。问题可能出在哪里?任何帮助,将不胜感激。
更新:是否可以为 DLL 构建一个 DLL Any CPU
?如果没有,还有其他选择吗?
我在David Broman 博客中找到了解决方案:
For x86 Machine
- Just run regsvr32 like you usually do.
For x64 or ia64 Machine
- If you want to be able to profile 64 bit apps,
run 64 bit regsvr32 against your 64 bit Profiler DLL
- If you want to be able to profile 32 bit apps (WOW),
run 32 bit regsvr32 against your 32 bit Profiler DLL.
- If you want to support both, do both!
换句话说,如果我们想要分析 x64 机器上的所有应用程序,我们需要构建 2 个具有相同 GUID (CLSID) 的 DLL,一个用于 x86 应用程序,另一个用于 x64 应用程序。
在 Windows 7 X64 机器上运行“任何 CPU”应用程序将默认使用 64 位 (x64) CLR(公共语言运行时),除非您明确告诉它以 32 位 (x86) 模式运行。
您可以通过使用.Net SDK 中提供的命令行工具更改其标志来强制将其加载到 32 位运行时:
corflags.exe /32BIT+ myAssembly.exe
这实际上会将其更改回 x86 dll。很可能,它在您的 xp 机器上运行的原因是因为您不支持该机器上的 64 位 CLR,因此即使它是“任何 CPU”,它也将始终以 32 位 x86 模式运行。
另请注意,“任何 CPU”DLL 将始终默认为加载它的主机应用程序的位数。
我假设您必须在探查器 DLL 中执行与 64 位 (x64) 不兼容的操作。问题是“无法正常工作”是什么意思。您是否遇到“错误的图像格式”之类的异常,或者该 DLL 是否由另一个编译方式不同的程序集调用?有什么意想不到的结果?