2

我正在运行 64 位 Windows 7、Studio 2012,并且不完全理解以下行为:

  1. 我通过 regsvr32 注册了第 3 方 COM dll
  2. 我创建了一个 ASP.Net 项目。
    • 我引用了 COM 类型库
    • 我将目标 CPU 设置为“AnyCPU”
    • 一切都编译并运行良好

  3. 我创建了一个控制台应用程序
    • 我引用了 COM 类型库
    • 我将目标 CPU 设置为“AnyCPU”
    • 它可以编译,但我收到运行时错误“未注册 COM 库”。
    • 我将目标 CPU 切换到 x86 并且运行良好。

将站点部署到 IIS 时,我必须在应用程序池中“启用 32 位应用程序”才能使其正常工作。也许这是在 Visual Studio 开发服务器中自动完成的。

Visual Studio 开发服务器只是将我的网站作为 32 位幕后运行,还是这里有更深层次的工作?

4

2 回答 2

4

是的,您的 Web 服务器将您的网站作为 32 位应用程序运行。

于 2013-03-28T15:19:16.467 回答
3

在 IIS 中启用“32 位应用程序”会启动 x86 版本的 w3wp 进程。

AnyCPU 是 .NET 提供的一个方便的功能,它决定应用程序启动时选择哪种处理器架构。这是可能的,因为 .NET 应用程序不会编译为 x86/x64 机器代码,而是编译为中间语言。启动应用程序时,它会在后台编译为 x64 或 x86 机器代码。

但是,非 .NET 应用程序通常直接编译为目标系统的机器代码。此外,COM 服务器必须在 x86 和 x64 的不同注册表分支中注册。

由于您只有一个 32 位兼容服务器 (DLL),这会导致您描述的情况:

  1. 使用 AnyCPU 启动控制台应用程序时,它会根据系统使用的体系结构编译为 x86 或 x64。在此之后,引用被加载。如果您使用的是 x64,则该进程无法找到服务器的 COM 工厂。否则一切都好。这就是为什么你永远不应该使用带有 COM 引用的 AnyCPU。
  2. IIS 只能以两种模式运行:显式 x86 或 x64(默认)。启用“32 位应用程序”会导致一个 x86 进程,它以 x86 模式加载您的 Web 应用程序。当您在“AnyCPU”上时,您的 COM 引用很好。但是,如果您出于某种原因禁用“32 位应用程序”,则会遇到麻烦。将“x64”设置为目标平台将导致BadImageFormatException.
于 2013-03-28T15:32:47.150 回答