【问题标题】:How to do excel interop on windows 2008?如何在 windows 2008 上进行 excel 互操作?
【发布时间】:2010-09-02 18:57:24
【问题描述】:

最近在 Windows Server2008、IIS7(安装了 Office)上部署了我的 Web 应用。

在追逐(和捕捉)各种其他错误之后,我面临着一个我什至不知道从哪里开始的错误。

在 Cassini(Visual Studio 开发服务器)上一切正常(通过 excel 互操作读取 excel)。

在 w2008 IIS 上它会抛出模糊的错误:

值不能为空。 参数名称:o

[ArgumentNullException:值不能为空。 参数名称:o] System.Runtime.InteropServices.Marshal.FinalReleaseComObject(Object o) +9430474 c:\longpath\ExcelReader.cs:23 中的 longnamespace.ExcelReader.Dispose() c:\longpath\ApplicationFormReader.cs:32 中的 longnamespace.ApplicationFormReader.Read(String path)

目前,我将添加 null 检查并查看情况是否会好转,但我确实怀疑它只是在开始读取任何内容之前就爆炸并丢弃在 finally 块上。

尝试将应用程序池设置为在本地系统下运行,但这并没有改变任何东西。

有什么想法吗?


这就是 dispose 方法的样子

    //http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c/159419#159419
    public void Dispose(){
      GC.Collect();
      GC.WaitForPendingFinalizers();
      GC.Collect();
      GC.WaitForPendingFinalizers();
      Marshal.FinalReleaseComObject(_ws); //Worksheet, line 23
      _wb.Close();
      Marshal.FinalReleaseComObject(_wb); //Workbook
      _ap.Quit();
      Marshal.FinalReleaseComObject(_ap); //Application
    }

我相信这个事件是相关的

机器默认权限设置不授予具有 CLSID 的 COM 服务器应用程序的本地激活权限 {00024500-0000-0000-C000-000000000046} 从地址 LocalHost(使用 LRPC)到用户 NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20)。可以使用组件服务管理工具修改此安全权限。

如果是这样 - 任何人都可以翻译吗?

在组件服务中为Microsoft Excel Application 添加权限到Network service 不知何故不起作用。一种。

删除身份验证级别也没有帮助。


改为

  if (_ws != null)
    Marshal.FinalReleaseComObject(_ws);
  if (_wb != null)
  {
    _wb.Close();
    Marshal.FinalReleaseComObject(_wb);
  }
  if (_ap != null)
  {
    _ap.Quit();
    Marshal.FinalReleaseComObject(_ap);
  }

让我们看看结果如何......

【问题讨论】:

    标签: asp.net excel iis-7 interop windows-server-2008


    【解决方案1】:

    异常看起来相当简单:在代码的第 23 行,您正在调用 Marshal.FinalReleaseComObject,并传递了一个空引用。

    所以 _ws、_wb 或 _ap 是一个空引用。如果您查找第 23 行,您将能够看到哪个。

    要解决这个问题,请在调用 FinalReleaseComObject 之前测试 null。

    您的活动中引用的 GUID {00024500-0000-0000-C000-000000000046} 是 Excel - 您可以使用 RegEdit 查看。

    所以我怀疑正在发生的事情是,由于权限不足,您尚未发布的尝试实例化 Excel 应用程序对象 (_ap?) 的代码会引发异常。然后因为您的 Dispose 方法没有检查 _ap 是否为空,所以它又在那里抛出。

    当您希望将本地激活权限授予网络服务帐户时,我怀疑您走在正确的轨道上。不知道为什么这不起作用,也许您需要重新启动或重新启动 IIS?

    更新 此外,不建议在服务器应用程序中使用 Excel 互操作。最好以其他方式操作 Excel 文档,例如使用 Aspose 等第三方组件。

    我似乎记得的一件事是 Excel 需要在具有本地配置文件的帐户下运行,而网络服务帐户可能不是这种情况。因此,如果您需要使用 Excel 互操作,则在评论中提到的不同帐户下运行它可能是最佳解决方案。

    【讨论】:

    • 奇怪的是 - 如果在 IIS 上部署之前从未出现过,为什么它为空? ://
    • 切换到特定用户作为 dcom 设置中的身份,它终于奏效了。天哪,我累了……整天都在和这样的问题作斗争。该回家了。感谢您的宝贵时间。
    • “奇怪的是 - 为什么它在部署到 IIS 之前从未存在过?” - 可能是因为未发布的其他代码在部署到 IIS 之前成功实例化了 _ap 对象。
    • 嗨,Arnis,我面临着类似的问题。我在我的 asp.net 应用程序中使用 excel 互操作,它工作了一周,但现在它抛出错误“路径不是合法形式”。你能解释一下你是如何在 dcom 中切换到特定用户作为身份的吗?
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2023-03-25
    • 1970-01-01
    • 2011-05-25
    • 2012-12-16
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多