【问题标题】:DLL not working on x64 systemDLL 在 x64 系统上不起作用
【发布时间】:2025-11-24 13:15:02
【问题描述】:

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

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

【问题讨论】:

  • 您的应用程序是 32 位 吗?!如果它被编译为 x86 它不能在 x64 世界中工作(在 64 位操作系统应用程序上任何 CPU 都将运行 64 位)
  • @Adriano 错了,32 位应用程序可以在除 16 位和 8 位之外的任何世界中运行 :)
  • 试过了:*.com/a/4463418/1064610 ?
  • @VladL 32 位应用程序可以在 64 位系统上运行,但您不能在 64 位应用程序中加载库。参考:support.microsoft.com/kb/282423
  • 问题是你不能在一个进程中运行32位和64位的dll

标签: c++ .net profiling profiler


【解决方案1】:

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

【讨论】:

  • 我告诉过你两个都可以注册
【解决方案2】:

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

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

corflags.exe /32BIT+ myAssembly.exe

这实际上会将其更改回 x86 dll。很可能,它在您的 xp 机器上运行的原因是因为您不支持该机器上的 64 位 CLR,因此即使它是“任何 CPU”,它也将始终以 32 位 x86 模式运行。

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

我假设您必须在探查器 DLL 中执行与 64 位 (x64) 不兼容的操作。问题是“无法正常工作”是什么意思。您是否遇到“错误的图像格式”之类的异常,或者该 DLL 是否由另一个编译方式不同的程序集调用?有什么意想不到的结果?

【讨论】:

  • 据我了解,没有办法只为所有应用程序使用一个 dll。在这种情况下,在 x64 机器上有 2 个 dll 如何分别设置环境变量。即:我有一个要分析的应用程序列表,并且我以前知道它们的兼容性,有没有办法强制系统在应用程序运行之前为其配置环境变量(例如,让系统在应用程序执行之前执行命令行)
  • 当您注册 32 和 64 COM 程序集时,它们会在注册表的不同部分注册(32 位的 Wos6432Node),因此您只需使用相同的环境变量,运行时将使用正确的注册表区域 -我对 32 位和 64 位 COM 对象使用相同的 CLSID
  • 嗯,它似乎适用于 OpenCover(它是一个 .NET 分析器)——看看源代码。
  • 我不知道这个问题(尽管您可以为用户或服务(注册表)设置它们)。但是,探查器 DLL 可以读取公共环境变量(包含您要处理的应用程序的名称)并在初始化期间使用它们,如果它不是您要分析的应用程序,则返回 E_FAIL。
  • 无需使用本机代码(即 C++)编写分析器程序集,因此您唯一的选择是 32 或 64,在这种情况下没有 AnyCPU 这样的东西。查看@leppie 的分析器或 opencover 代码库。我将向您推荐大卫布罗曼关于整个主题的博客blogs.msdn.com/b/davbr,特别是blogs.msdn.com/b/davbr/archive/2006/11/13/…