服务器执行失败(HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE) 异常)

50

我正在尝试使用Microsoft.Office.Interop.Excel.Workbook类在服务器端将.xls文件转换为.xlsx文件,如下所示:

 workBook.SaveAs("FILENAME_HERE", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

然后我收到以下错误:

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)). : System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
   at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
   at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
   at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj)
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at CALLING_METHOD_IN_MY_LIBRARY_HERE...

问题在于这个错误只会发生在演示服务器上;但在我的本地机器上它可以正常工作。

我在演示服务器上尝试的事情:

  1. **1)运行dcomcnfg打开组件服务

2)展开“组件服务”->“计算机”->“我的计算机”->“DCOM配置”

3)找到“Microsoft Excel应用程序”。

4)右键单击以打开属性对话框

5)单击“安全”选项卡,

6)“启动和激活权限,配置权限,添加权限 - 在管理员用户(此用户),交互式用户和启动用户下运行”

7)启动和激活权限+访问权限+配置权限=>添加IIS_IUSRS + Network Service具有完全控制权**

2. 将将转换.xls文件的项目的构建从“任何 CPU”更改为“x86”,并在本地机器上发布此库至服务器。

有人解决了这个问题吗? 我已经努力解决这个问题两天了。


我知道这似乎很傻,但是你在服务器上是否正确安装了Excel? - Funkotron_King
是的,我在服务器上安装了Excel。 - Tamas Ionut
你找到解决方案了吗? - Aleksei Kosozhikhin
试试这个,对我很有帮助。post - mapjaha
对我来说,只有在DCOM | 属性 | 标识选项卡下将IIS用户设置为“此用户”才有效。 - dudeNumber4
显示剩余2条评论
10个回答

33
使用 DCOMCNFG.exe。打开它并转到: 组件服务 -> 计算机 -> 我的计算机 -> DCOM 配置 -> Microsoft Excel 应用程序
打开属性,选择 "标识" 选项卡并选择交互式用户。

8
只有用户登录到服务器才能实现此功能。 - Praveen Govind
3
如果该路径中没有“Microsoft Excel Application”条目,会怎样? - Silviu
和 @Silviu 一样,我在路径中也没有看到 Microsoft Excel 应用程序条目。此外,这只有在用户登录时才有效吗? - Ravi Khambhati

13

我在其他地方找到了解决方法。

按照以下方式操作确实解决了我的问题:

使用 DCOMCNFG.exe。 打开它,然后转到:组件服务-> 计算机-> 我的计算机-> DCOM 配置-> Microsoft Excel 应用程序。 打开属性,选择标识选项卡,然后选择交互式用户。

但是 - 问题每隔几分钟就会再次出现!

经过数小时的尝试寻找原因,我注意到我的服务器有数百个已打开的 WINWORD.EXE 进程。这导致了内存问题,从而导致了 exception from hresult 0x80080005 错误。

很傻的是,我忘记写代码来 关闭 交互应用程序。一旦我修复了这个问题,错误就消失了。

doc.Close(false);
Marshal.ReleaseComObject(doc);
word.Quit();
Marshal.ReleaseComObject(word);

我曾经在尝试与MapPoint Interop交互时解决过完全相同的问题。 - Daniele Sartori

8
我发现这篇文章更深入地讨论了这个问题,如果有帮助的话,“80080005服务器执行失败(HRESULT:0x80080005(CO_E_SERVER_EXEC_FAILURE))”错误可能是由以下原因引起的:
  1. 机器的CPU负载过高,进程启动时间过长,在120秒内无法执行CoRegisterClassObjects()。
  2. COM服务器没有注册正确的类ID。
  3. COM服务器当前正在停止,存在一个CoCreateInstance和COM服务器停止部分之间的竞争条件。
  4. COM服务器启动时存在安全问题(此页面似乎暗示密码拼写错误或缺少“批处理作业登录”特权以便“Run As…” COM服务器运行,但我建议您针对您特定的配置重新验证这些信息)。
https://blogs.msdn.microsoft.com/adioltean/2005/06/24/when-cocreateinstance-returns-0x80080005-co_e_server_exec_failure/

1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户知道它是什么以及为什么存在,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除。 - Papershine
@paper1111,我已经编辑了我的回答。为什么要投反对票呢?给足够的时间来改进回答。虽然我欢迎你的建议,但我正在处理类似的问题,并从微软技术支持直接获得了解决方案。如果有人标记回答为负面,用户就不会重视回答或链接。 - ChiragMM

3
我用以下方法解决了这个问题: 右键单击Component Services/Computers/DCOM Config/Microsoft Word97 - 2003 Document,然后选择属性/常规选项卡。 将身份验证级别设置为:无。

2
我的解决方法是从“文件”->“选项”->“保存”中禁用自动恢复,然后丢弃所有自动恢复的文件。看起来是自动恢复文件的数量导致了根本原因。
背景 我经常进行打开/关闭/计算循环。周期性地,C#应用程序无法打开工作簿,并显示以下错误。
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).

该应用程序反复抛出此错误,并且在从 Excel 中清除自动恢复文件之前一直处于此状态。
另一个症状是,当我尝试打开 Excel 应用程序(好像要创建新工作簿,而不是打开现有的工作簿)时,它需要很长时间旋转 CPU 循环。最终它会打开,左侧的“已恢复文件”窗格中列出了大量文件。
我使用按钮关闭窗格,然后所有文件都被丢弃。在执行此过程后再次打开 Excel 几乎是瞬间完成的。从此以后,该应用程序再次正常运行。

1
这也是我的情况。实际上,我通过打开Excel,在恢复选项卡中看到数百个文件列表,点击“关闭”恢复选项卡,删除所有文件,然后关闭Excel来解决它。下次我尝试使用interop时,错误不再发生。 - Laurent

0

我遇到的同样问题是通过为服务“允许桌面交互”来解决的。(在tomcat6w配置工具的登录选项卡中)


0

开始 -> 运行 (Windows+R)

输入: dcomcnfg -32 (按回车键) 这应该会打开组件服务

展开组件服务、计算机、我的电脑、DCOM Config

向下滚动到"Microsoft Excel 应用程序"

右键单击,选择属性,转到安全选项卡

编辑访问权限

点击添加

输入<Computer_Name>/IIS_IUSRS (或者进入位置,选择计算机名称 - 如果使用域,默认情况下,它将搜索域,而不会找到IIS_IUSRS)

确保“允许”复选框被选中,“本地访问”

点击确定,再次点击确定(不需要重新启动)

Windows 更新会每次重置这个设置


0
我在我的Visual Studio控制台应用程序中遇到了类似的问题。我尝试了"Vladimir Shiyanov"提到的上述解决方案。
除此之外,我的应用程序被设置为仅运行32位应用程序,当我取消选中后,应用程序成功运行。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,比如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

0
我尝试了所有的方法,但都没有起作用。 对我来说,只是打开Excel让它起作用,然后关闭它。就是这样,只是打开它然后关闭它。我真的不明白为什么会这样。我尝试了两次,都出现了同样的错误,都通过打开Excel解决了。

-4
尝试添加Thread.Sleep方法,例如在workBook.open和workBook.SaveAs两种方法后加入Thread.Sleep(2000)来延迟2秒。如果您的Excel文件有很多格式,请尝试增加几秒钟的延迟时间。

打开和保存Excel文件时没有可用的回调函数。我在保存文件时遇到了问题。微软支持团队给了我一个提示,在保存后添加睡眠时间。这对我有用。 - Robert 30005

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接