DLL无法在x64系统上运行

时间:2013-03-06 09:18:06

标签: c++ .net profiling profiler

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

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

2 个答案:

答案 0 :(得分:2)

我在David Broman Blog中找到了解决方案:

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

答案 1 :(得分:1)

在Windows 7 X64计算机上运行“Any CPU”应用程序将默认使用64位(x64)CLR(公共语言运行库),除非您明确告诉它以32位(x86)模式运行。

您可以使用.Net SDK中提供的commandline tool更改标记,强制将其加载到32位运行时:

corflags.exe /32BIT+ myAssembly.exe

这实际上会将其更改回x86 dll。最有可能的是,它在xp机器上工作的原因是因为你不支持该机器上的64位CLR,所以它总是以32位x86模式运行,即使它是“任何CPU”。

另请注意,“Any CPU”DLL始终默认为加载它的主机应用程序的位数。

我假设你必须在你的探查器DLL中做一些不兼容64位(x64)的东西。问题是“你的工作不正常”是什么意思。你得到一个像“坏图像格式”的异常,或者是由另一个编译不同的程序集调用的DLL吗?有什么意外的结果?