c# - 通过 Microsoft HPC 上的 Com-interop C# API 打开 excel 文件

标签 c# excel interop windows-server-2008 hpc

我正在使用 Windows 我正在尝试制作一个运行 的小程序网格上的宏。我正在使用 Com Interop API
它在我的计算机上工作正常,它运行不同的 VBA 宏,但是当我在网格上使用它时,它不再工作。 Open 方法无法正常工作。

workBook = excelApp.Workbooks.Open(path, Type.Missing,false, Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

这是从法语翻译过来的异常:

Exception Found: Type: System.Runtime.InteropServices.COMException Message: Microsoft Office Excel can't access the file

\server\path\test.xls. There is multiple possibilities :

  • The file's name or the path doesn't existe
  • The file is currently used par another program
  • The workbook you are trying to use has the same name of another workbook already open

Source: Microsoft Office Excel

Stacktrace: at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad) at namespace.ExcelFile.readExcel(Application excelApp) in E:\path\ExcelFile.cs:line 37

我尝试使用与应用程序中使用的帐户相同的帐户从计算节点访问该文件,并且工作正常。我可以访问它,似乎没有其他程序使用它,并且Excel未打开。
编辑:我还可以在计算节点上运行我的小型应用程序,而无需使用 Microsoft API(头节点)

我缺少什么?

最佳答案

因此,在处理 HPC 时实例化应用程序(例如 Office COM)的 COM API 时,需要记住一些事情。本地运行时你似乎已经覆盖了权限;然而,当以服务的名义运行时,它会变得有点棘手。

HPC 在托管您的服务时模拟 IIS;因此必须以类似方式对待;在 IIS 中,当您需要通过 WCF 服务运行这些应用程序之一时,您通常会指定允许 AppPool 的身份启动一个配置文件,该配置文件将为应用程序配置文件目录提供访问权限以执行操作。您还必须确保您对应用程序池进行的任何设置(在没有 HPC 的情况下运行这些服务)也会反射(reflect)在您放置在 HPC 服务注册目录中的服务配置文件中。

如果此应用程序是 32 位应用程序(您的应用程序不是 COM+),您必须向 SericeRegistration 标记添加一个条目以指定此应用程序,就像在 IIS 中配置应用程序池以接受 x86 应用程序一样。默认情况下,HPC 在 Broker 的配置文件内部指定架构=“X64”。

<microsoft.Hpc.Session.ServiceRegistration>
    <service assembly="C:\ServicesR2\OfficeService.dll"
      contract="OfficeService.IOfficeService" type="OfficeService.OfficeService"
      includeExceptionDetailInFaults="true" maxConcurrentCalls="0"
      serviceInitializationTimeout="60000" enableMessageLevelPreemption="true"
      stdError="" maxMessageSize="65536" soaDiagTraceLevel="Off"
      architecture="X86" />
</microsoft.Hpc.Session.ServiceRegistration>

确保您在以下位置有一个名为“Desktop”的目录:

C:\Windows\SysWOW64\config\systemprofile\ C:\Windows\System32\config\systemprofile\

这适用于集群中的所有节点;如果您仅运行 32 位 Windows,则可以忽略 SysWow64 目录位置。

接下来您需要检查 Office Excel 的 DCOM 设置。为此,只需打开运行对话框并输入:

Dcomcnfg -32

我们添加 -32 以打开 32 位 DCOM 配置,因为 Office 仅提供 32 位 COM+ 对象来使用(对于 2010 年及以下版本,我无法评论 365/2013)。

确保选中“位置”下的“在此计算机上运行应用程序”。

确保在“安全”下,您的帐户可以完全控制启动和激活权限、访问权限和配置权限。如果您的用户是此系统上的管理员帐户,您不需要进行任何更改,因为默认情况下管理员具有这些能力。

如果运行此任务的计算节点是 Windows Server 2008 R2 计算机,请在“身份”选项卡中指定 -“启动用户”。如果运行此任务的计算节点是 Windows Server 2012 计算机,请指定 -“此用户”并提供您的凭据;或指定交互用户。我对后者运气不太好,所以我建议前者。

处理完这些事情后,您的 HPC 服务应该可以正确执行应用程序,而不会看到那些讨厌的失败 COM+ 错误。

此外,您需要额外确保在退出时清理应用程序;我强烈建议您为 WCF 服务编写一个小例程作为finally,当您完成后,该例程会终止 excel 进程;我发现,在 HPC 下使用 Excel 时,终止应用程序的常用方法显然并不可靠。

关于c# - 通过 Microsoft HPC 上的 Com-interop C# API 打开 excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15224547/

相关文章:

excel - 如何在excel-vba中查找重命名工作表的索引号

.net - 当我的 .net 程序集不再位于同一位置时,如何取消注册?

c# - 使用 excel.interop 替换 excel 中的单元格值

excel - 用于打开受密码保护的 Excel 的 Google Apps 脚本?

c# - 当我使用它时,我的 IF 属性在我的类(class)中被忽略了

c# - 使用 C# 在 Windows 资源管理器中添加新字段

c# - 如何检查两个 System.Drawing.Color 结构是否以 16 位色深表示相同的颜色?

excel - 在 Excel VBA 中确定一个点的值

c# - .NET 互操作 : Using an assembly in the current directory

c# - 强制 C# 应用程序在 64 位服务器上以 32 位模式运行