3

我刚刚编写了一个 .NET 分析器(CLR 将使用的 DLL)。实际上,该 DLL 可在 Windows XP 上使用专为应用程序设计的Any CPU应用Win32程序。但是,在 Windows 7 x64 上,它仅适用于为x86体系结构设计的应用程序。问题可能出在哪里?任何帮助,将不胜感激。

更新:是否可以为 DLL 构建一个 DLL Any CPU?如果没有,还有其他选择吗?

4

2 回答 2

2

我在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 应用程序。

于 2013-03-16T19:11:51.730 回答
1

在 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 是否由另一个编译方式不同的程序集调用?有什么意想不到的结果?

于 2013-03-07T23:20:51.717 回答