代码之家  ›  专栏  ›  技术社区  ›  Arnis Lapsa

如何在windows2008上实现excel互操作?

  •  0
  • Arnis Lapsa  · 技术社区  · 15 年前

    最近在WindowsServer2008 IIS7(安装了Office)上部署了我的web应用。

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

    参数名称:o

    [ArgumentNullException:值不能为null。 System.Runtime.InteropServices.Marshal.finalreleasecom对象(对象o)+9430474 longnamespace.ExcelReader.Dispose文件()在c:\longpath中\精读。cs:23 longnamespace.ApplicationFormReader.Read(字符串路径)在c:\longpath\A中applicationFormReader.cs:32

    目前,我将添加空检查,看看情况是否好转,但我确实怀疑它只是爆炸和处理上 finally 在它开始读任何东西之前阻止它。

    试图将应用程序池设置为在localsystem下运行,但这并没有改变任何事情。


        //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服务器应用程序的本地激活权限 从地址LocalHost(使用LRPC)发送到用户NT AUTHORITY\网络服务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);
      }
    

    让我们看看进展如何。。。

    1 回复  |  直到 15 年前
        1
  •  2
  •   to StackOverflow    15 年前

    异常看起来相当简单:在代码的第23行,您正在调用Marshal.finalreleasecom对象,传递空引用。

    要解决此问题,请在调用finalEleaseComObject之前测试null。

    事件中引用的GUID{00024500-0000-0000-C000-000000000046}是Excel,您可以在RegEdit中看到这一点。

    我怀疑你是在正确的轨道上,当你想给本地激活权限的网络服务帐户。不知道为什么这不工作,也许你需要重新启动或重新启动IIS?

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