Откройте файл Excel через Com-interop C # API на microsoft HPC

Я работаю над hpc и I 'в Windows я пытаюсь создать небольшую программу, которая запускает excel ' s макрос в сетке. Я использую 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 (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) в пространстве имен .ExcelFile.readExcel (приложение excelApp) в E: \ path \ ExcelFile.cs: строка 37

Я попытался получить доступ к файлу с вычислительного узла с той же учетной записью, что и в приложении, и он отлично работает. Я могу получить к нему доступ, похоже, что нет другой программы, использующей его, а Excel не открыт.
Изменить: я также могу запустить свое небольшое приложение на вычислительном узле без использования Microsoft API (головной узел)

Что мне не хватает?


person Thibaut    schedule 05.03.2013    source источник


Ответы (2)


Таким образом, при работе с COM API, который создает экземпляр приложения (например, офисного COM) при работе с HPC, следует помнить о нескольких вещах. Кажется, вы уже получили разрешения при локальном запуске; однако при работе под видом службы это становится немного сложнее.

HPC издевается над IIS, поскольку на нем размещается ваша служба; и как таковые должны рассматриваться аналогичным образом; в IIS, когда вам нужно запустить одно из этих приложений через службу WCF, вы обычно указываете, что удостоверение AppPool может запускать профиль, который предоставит каталогам профилей приложений доступ для выполнения действий. Вы также должны убедиться, что любые настройки, которые вы вносите в свои пулы приложений для запуска этих служб без HPC, также отражаются в файле конфигурации службы, который вы помещаете в каталог регистрации службы для HPC.

Если это приложение является 32-битным (ваше приложение не COM +), вы должны добавить запись в тег SericeRegistration, чтобы указать это так же, как вы настраиваете пулы приложений в IIS для приема приложений x86. По умолчанию HPC указывает архитектуру = "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>

Убедитесь, что у вас есть каталог «Рабочий стол» в следующих местах:

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

Это для всех узлов в кластере; если вы используете только 32-битные окна, вы можете игнорировать расположение каталога SysWow64.

Затем вам нужно пойти и проверить настройку DCOM для Office Excel. Для этого просто откройте диалог запуска и введите:

Dcomcnfg -32

Мы добавляем -32, чтобы открыть 32-битную конфигурацию DCOM, поскольку Office предоставляет для использования только 32-битные объекты COM + (ну, для 2010 года и ниже, я не могу комментировать 365/2013).

Убедитесь, что в разделе «Местоположение» установлен флажок «Запускать приложение на этом компьютере».

Убедитесь, что в разделе «Безопасность» ваша учетная запись имеет полный контроль над разрешениями на запуск и активацию, разрешениями на доступ и разрешениями на настройку. Если ваш пользователь является учетной записью администратора в этой системе, вам не нужно вносить какие-либо изменения, поскольку администраторы по умолчанию имеют эти возможности.

Если вычислительный узел, на котором выполняется эта задача, является машиной с Windows Server 2008 R2, укажите на вкладке «Удостоверение» - «Запускающий пользователь». Если вычислительный узел, на котором выполняется эта задача, является компьютером с Windows Server 2012, укажите - «Этот пользователь» и укажите свои учетные данные; или укажите интерактивного пользователя. Со вторым мне не повезло, поэтому я предлагаю первое.

После того, как вы позаботитесь об этих вещах, ваша служба HPC должна правильно выполнять приложение, не видя этих надоедливых ошибок COM +.

Кроме того, вы должны быть уверены, что очищаете приложение при выходе; Я настоятельно рекомендую вам написать небольшую процедуру для вашей службы WCF, которая убивает процесс excel, когда вы закончите; Я обнаружил, что при использовании Excel под HPC обычные методы завершения работы приложения просто ненадежны.

person Kaiser12    schedule 08.03.2013
comment
В будущих публикациях постарайтесь резюмировать еще немного - person Lobo; 08.03.2013
comment
Вау, прежде всего спасибо за ответ. Я просто не знал, что .COM использует WCF, а сетка, над которой я работаю, не имеет узла брокера. Я свяжусь с администраторами, а затем настрою узел брокера, как вы сказали. Большое тебе спасибо. - person Thibaut; 08.03.2013
comment
@Thibaut, пожалуйста, надеюсь, это поможет. Когда я начинал с HPC, у меня было так много проблем с MS Office Com. - person Kaiser12; 08.03.2013

Когда вы говорите, что можете получить к нему доступ, вы имеете в виду через файловую систему с помощью проводника или через код? Возможно ли, что вашему коду не нравится путь или он думает, что есть проблема с разрешениями?

Если вы добавите что-то вроде следующего, каков результат?

 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);
 }
person GojiraDeMonstah    schedule 05.03.2013
comment
Таким образом, я могу сделать и то, и другое: открыть его через проводник с моей учетной записью, а также переместить его с помощью некоторого кода непосредственно перед попыткой открыть его с помощью взаимодействия (я олицетворяю действия с моей учетной записью в коде). Ваш фрагмент кода не выбросить любое исключение. Поскольку моя программа выполняется локально и на вычислительном узле, это означает, что проблема заключается в планировщике на головном узле, он должен изменить что-то еще, кроме учетной записи ... Но я не могу понять, что? - person Thibaut; 06.03.2013