2

我在我的 ASP.NET MVC 3 项目中引用了一些 32 位和一些 64 位 DLL。

项目编译但我得到运行时错误。

这是因为我将 Web 项目作为 64 位运行。

如何在我的本地 IIS 中“启用 32 位”(我如何在 IIS 7.5 Pro 中做到这一点)?

我正在使用 .NET 4.0

我得到的错误是:

由于以下错误,检索具有 CLSID {A6775dfd2-1dfF-421C-A187-4D55F4DDFBFF} 的组件的 COM 类工厂失败:80040154 未注册类(来自 HRESULT 的异常:0x80040154 (REGDB_E_CLASSNOTREG))。

4

3 回答 3

4

如果您不需要 64 位组件(不确定那里运行的是什么,或者是否可以排除它,因为您只是想知道如何在 32 位以上运行)

http://learn.iis.net/page.aspx/201/32-bit-mode-worker-processes/

您可以通过以下方式在服务器级别设置它:%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.enable32BitAppOnWin64:true

或设置您的特定应用程序池(更推荐恕我直言)您可以尝试以下操作。抱歉,这个来自的页面似乎不再活跃,现在只有谷歌缓存显示它:

强制 IIS 创建 32 位应用程序池工作进程

如果您的应用程序作为 Web 应用程序运行,这意味着它在 IIS 应用程序池工作进程中运行,您将希望该工作进程 (w3wp.exe) 是 32 位进程。这可以在应用程序池的高级设置中指定:

为您的 Web 应用程序选择应用程序池。单击右侧编辑应用程序池下的高级设置...。将(常规)下的启用 32 位应用程序的值更改为 True。

请注意,设置中的“启用”一词并不意味着“允许”,如“允许 32 位或 64 位应用程序”。它实际上意味着“强制”,如“强制工作进程以 32 位模式运行,以便支持 32 位应用程序”。这意味着当此设置的值为 True 时,应用程序池工作进程将始终作为 32 位进程启动。将其设置为 False 将启动 64 位应用程序池工作进程。

请注意,当启动应用程序池工作进程时,它会在任务管理器的进程选项卡上的映像名称列中显示为 w3wp.exe。当启用 32 位应用程序设置的值为 True 时,它​​将被列为 w3wp.exe *32。

于 2012-05-23T01:26:14.297 回答
2

IIS Express 7.5(如果您安装它,则由 Visual Studio 2010 使用)仅为 32 位:

http://learn.iis.net/page.aspx/1265/iis-75-express-readme/

去引用:

支持 32 位和 64 位系统,但仅存在 IIS 7.5 Express 的 32 位版本。

因此,我无法想象您的问题与通常的 32 位 / 64 位池模式问题有关,如果您的所有 DLL 都是 32 位,则可能会出现这些问题。

但是,如果您尝试加载 64 位 COM DLL,那么这将失败;64 位二进制文​​件不能加载到 32 位进程中,反之亦然。

另一个问题是在选择要调试的 Web 服务器时忘记勾选Use IIS Express复选框:

在此处输入图像描述

如果您不勾选该复选框,那么您将在Windows 附带的 IIS7 版本上的DefaultWebSite中的子应用程序中运行您的站点。

DefaultWebSiteDefaultAppPool中运行,它在 64 位版本的 Windows 中作为 64 位进程运行。因此,如果您想使用它并使用 32 位二进制文​​件,则需要将DefaultAppPool更改为以 32 位运行。

您需要使用 IIS7 的 MMC 管理单元或通过appcmd.exe从命令行运行该工具来执行此操作。

于 2012-05-23T00:48:43.930 回答
0

将编译目标设置为 x86 而不是 AnyCPU 或 x64。您的 dll 将始终以 32 位运行,而无需弄乱 IIS 服务器设置。

于 2012-05-23T08:19:56.767 回答