2

我正在使用 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);

这是从法语翻译的异常:

发现异常:类型:System.Runtime.InteropServices.COMException 消息:Microsoft Office Excel 无法访问文件

\服务器\路径\test.xls。有多种可能性:

  • 文件名或路径不存在
  • 该文件当前与另一个程序一起使用
  • 您尝试使用的工作簿与已打开的另一个工作簿具有相同的名称

来源:Microsoft Office Excel

Stacktrace:在 Microsoft.Office.Interop.Excel.Workbooks.Open(字符串文件名、对象 UpdateLinks、对象只读、对象格式、对象密码、对象 WriteResPassword、对象 IgnoreReadOnlyRecommended、对象来源、对象分隔符、对象可编辑、对象通知、对象转换器, Object AddToMru, Object Local, Object CorruptLoad) at namespace.ExcelFile.readExcel(Application excelApp) in E:\path\ExcelFile.cs:line 37

我尝试使用与应用程序中使用的帐户相同的帐户从计算节点访问文件,并且工作正常。可以访问,好像没有其他程序在使用,Excel也打不开。
编辑:我也可以在不使用 Microsoft API(头节点)的情况下在计算节点上运行我的小应用程序

我错过了什么?

4

2 回答 2

2

因此,在处理使用 HPC 时实例化应用程序(例如办公室 COM)的 COM API 时,需要记住一些事项。在本地运行时,您似乎已经涵盖了权限;但是,当以服务的名义运行时,它会变得有点棘手。

HPC 在托管您的服务时模拟 IIS;因此,必须同样对待;在 IIS 中,当您需要通过 WCF 服务运行这些应用程序之一时,您通常指定允许 AppPool 的身份启动配置文件,该配置文件将授予应用程序配置文件目录以访问以执行操作。您还必须确保您对应用程序池所做的任何设置以在没有 HPC 的情况下运行这些服务也反映在您放置在 HPC 的服务注册目录中的服务配置文件中。

如果此应用程序是 32 位应用程序(您的应用程序不是 COM+),您必须在 SericeRegistration 标记中添加一个条目以指定此条目,这与您在 IIS 中配置应用程序池以接受 x86 应用程序的方式相同。默认情况下,HPC 在 Broker 的配置文件中内部指定 architecture="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 服务编写一个小例程作为最后的例程,该例程在您完成后终止 excel 进程;我发现在 HPC 下使用 Excel 时,终止应用程序的常用方法很明显我们不可靠。

于 2013-03-08T12:58:51.983 回答
1

当您说您可以访问它时,您是指使用资源管理器通过文件系统还是通过代码?您的代码是否可能不喜欢该路径或认为存在权限问题?

如果添加如下内容,结果是什么?

 System.IO.FileInfo info = new System.IO.FileInfo(path);

 if(info.Exists)
 {
      System.Security.Permissions.FileIOPermission permission =
           new System.Security.Permissions.FileIOPermission(
               System.Security.Permissions.FileIOPermissionAccess.AllAccess, path);

       permission.Demand();
 }
 else{ 
      throw new System.IO.FileNotFoundException(path);
 }
于 2013-03-05T22:33:03.007 回答