我刚写了一个.NET分析器(一个将由CLR使用的DLL)。实际上,DLL在Windows XP上可以使用专为Any CPU
和Win32
应用程序设计的应用程序。但是,在Windows 7 x64上,它仅适用于为x86
体系结构设计的应用程序。哪里可能是问题?任何帮助将不胜感激。
更新:是否可以为Any CPU
构建DLL?如果没有,还有其他选择吗?
答案 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吗?有什么意外的结果?