【问题标题】:XCOPY/Publish ASP.NET 3.5 Website in x86 onto a 64-bit ServerXCOPY/Publish ASP.NET 3.5 网站在 x86 上到 64 位服务器
【发布时间】:2010-07-13 19:42:54
【问题描述】:

我有一个使用 32 位 dll 的 ASP.NET “网站”。当我 XCOPY 到我们的 64 位服务器时,使用此 32 位 dll 的页面会引发异常。我已经为站点运行的应用程序池将“启用 32 位应用程序”设置为 True,但这无济于事。

我也在尝试将目标平台设置为 x86,但与 Web 应用程序不同,网站没有它的选项。

这是堆栈跟踪 -

Event code: 3005 
Event message: An unhandled exception has occurred. 
Event time: 7/13/2010 5:01:12 PM 
Event time (UTC): 7/13/2010 9:01:12 PM 
Event ID: 9611671ef6b845f39af6b26b89af85e3 
Event sequence: 51 
Event occurrence: 4 
Event detail code: 0 

Application information: 
    Application domain: /LM/W3SVC/2/ROOT-1-129235271319338750 
    Trust level: Full 
    Application Virtual Path: / 
    Application Path: C:\Site\ 
    Machine name: WWWTEST 

Process information: 
    Process ID: 4020 
    Process name: w3wp.exe 
    Account name: IIS APPPOOL\WWWTEST AppPool 

Exception information: 
    Exception type: COMException 
    Exception message: Retrieving the COM class factory for component with CLSID {58968145-CF05-4341-995F-2EE093F6ABA3} failed due to the following error: 80040154. 

Request information: 
    Request URL: http://site/Downloads.aspx 
    Request path: /Downloads.aspx 
    User host address: 192.168.1.101
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: WWWTEST\Webtest 

Thread information: 
    Thread ID: 4 
    Thread account name: WWWTEST\Webtest 
    Is impersonating: False 
    Stack trace:    at Downloads.Button_Click(Object Sender, DataGridCommandEventArgs E) in C:\Site\Downloads.aspx.vb:line 1034
   at System.Web.UI.WebControls.DataGrid.OnItemCommand(DataGridCommandEventArgs e)
   at System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e)
   at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args)
   at System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e)
   at System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args)
   at System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e)
   at System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

我在线搜索了异常“检索 COM 类工厂以获取具有 CLSID {58968145-CF05-4341-995F-2EE093F6ABA3} 的组件失败,原因是以下错误:80040154。”并在 IIS7 上启用了 32 位模式,但仍然没有成功。

非常感谢任何帮助。

** 回答 ** 在用户 Kev 的帮助下,我能够解决这个问题。这就是我所做的 -

  1. here 下载 Microsoft 开发人员支持 OLE 文件属性读取器 2.1 示例 (KB 224351)
  2. 使用 WinZip/7-zip 等将内容解压缩到临时文件夹。不要运行安装程序。将文件“Interop.DSOFile.dll”和“dsofile.dll”从提取的位置复制到服务器上应用程序的 bin 目录。
  3. 使用管理员权限打开 cmd 提示符并导航到服务器上的 bin 目录
  4. 输入“regsvr32 dsofile.dll”
  5. 确保应用程序池设置为启用 32 位应用程序。
  6. 重启 IIS

非常感谢,凯夫。我真的很感激。

【问题讨论】:

  • 抛出了什么异常?你能粘贴堆栈跟踪吗?
  • Kev,我已经用堆栈跟踪更新了这个问题。有什么想法吗?
  • 这是第三方组件吗?如果是这样,那是什么。我猜有一个互操作程序集?
  • 是的,它是一个互操作程序集。它使用 32 位框架,并且 dll 包含一个 32 位 COM 对象。 blogs.msdn.com/b/karthick/archive/2006/02/28/540780.aspx
  • @tempid - 这是一个自制的 COM 组件吗?谁是供应商?

标签: iis-7


【解决方案1】:

这听起来像是 COM 组件没有在服务器上注册。您需要将组件(dsofile.dll)复制到服务器并运行regsvr32.exe进行注册:

regsvr32 dsofile.dll

您还需要确保运行网站的帐户对该文件或其包含的文件夹具有读取权限。

也可能值得尝试构建您的项目并将构建更改为以 x86 而不是 Any CPU 为目标,尽管我怀疑这是问题所在。

【讨论】:

  • 我尝试在 Web 服务器上注册 COM,但错误提示“已找到模块,但未找到 DllRegister 服务器入口点。”由于这是一个网站项目,因此无法将目标设置为 x86。还有其他想法吗?
  • 给你 - regsvr32 /i "c:\Interop.DSOFile.Dll"
  • @tempid - 查看更新的答案。您没有注册互操作文件。这只是一个用于深入 COM 基础结构的托管 .NET 包装器。您还需要注册包含在 dsofile.dll 中的底层组件本身。
  • 在 Kev 的帮助下,我能够解决这个问题。这就是我所做的 - 1. 下载此文件 - microsoft.com/downloads/en/… 2. 将内容提取到临时文件夹。将文件“Interop.DSOFile.dll”和“dsofile.dll”复制到服务器上应用程序的 bin 目录中。 3. 使用管理员权限打开 cmd 提示符并导航到 bin 目录。 4. 输入 regsvr32 dsofile.dll 5. 确保应用程序池设置为启用 32 位应用程序。 6. 重启 IIS 非常感谢,Kev。我真的很感激。
  • @tempid - 为什么不使用此信息更新您的问题。把它粘在最后。如果遇到同样的问题,其他用户会更容易发现。
【解决方案2】:

您可能需要将运行应用程序的应用程序池设置为以 x86 方式运行。

【讨论】:

  • 这与在应用程序池中启用“启用 32 位应用程序”有区别吗?
  • @tempid - 不,没有这样的设置。您将 Enable 32-Bit Applications 设置为 true 是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多