Вопрос

Кто-нибудь знает, как заставить библиотеки взаимодействия MS Office 2007 .NET C# работать с Vista?

У меня есть приложение .NET C#, которое я настроил для запуска в качестве службы Windows.Эта программа откроет шаблон Word или Excel в зависимости от ситуации, изменит его содержимое, а затем сохранит документ обратно.Все это отлично работало, когда я делал это на компьютере с Windows Server 2003 или XP с использованием Office 2007.Когда я переместил все на сервер Server 2008, все перестало работать.Например, в Excel я получаю исключение COM, сообщающее мне, что файл Excel не может быть открыт, когда файл явно существует, и я могу прекрасно открыть его, делая это вручную.Служба Windows работает под той же учетной записью пользователя, под которой я вхожу в систему, и эта учетная запись является администратором.

Кто-нибудь знает, что делать?

Это было полезно?

Решение

Вам действительно следует избегать запуска клиентов Office в качестве приложений на стороне сервера. Попробуйте использовать xml в качестве формата файла (xlsx для Office 2007 или использовать книгу Excel xsd для (несколько) более старых версий.) Тогда вы освободитесь от использования API-интерфейса Excel на сервере.

Другие советы

В Vista и Windows Server 2008 службы работают в сеансе Session0.До Vista обычные программы запускались в Session0 вместе со службами.

Это означает, что Session0 превратился в пустыню без рабочего стола, где ваши службы даже не могут получить доступ к explorer.exe.Я почти уверен, что проблема в том, что приложения Office ожидают доступа к некоторым компонентам, которые обычно находятся на рабочем столе.

Поскольку Excel, Word и т. д.поддерживаются только в сеансе с настольным компьютером, у вас есть только несколько вариантов:

  1. Установите флажок «Рабочий стол» на вкладке «Вход в систему» ​​свойств вашей службы и молитесь, чтобы это удовлетворило богов Office.(Вероятно, не будет.)
    • После попытки 1 просмотрите свой код и попытайтесь удалить/обойти все, что приводит к сбою.
  2. Используйте удаленное взаимодействие/WCF, чтобы создать сервер, выполняющий работу по взаимодействию, и заставить вашу службу взаимодействовать с ним.
    • Вам понадобится вошедший в систему интерактивный пользователь, и пользователю необходимо каким-то образом запустить серверное приложение.Возможно, лучше всего использовать автозапуск.
    • Вы можете попробовать включить автоматический вход. http://support.microsoft.com/kb/324737
  3. Попробуйте выдать себя за вошедшего в систему пользователя, используя CreateProcessAsUser и его друзей.
    • Примечание:Я не знаю, насколько хорошо это работает, если пользователь на самом деле не вошел в систему, поэтому это может быть не более полезно, чем вариант 2 выше, и его гораздо сложнее реализовать.(Требуется P/вызов)
  4. Перепишите свою программу, чтобы использовать SDK OpenXML или использовать что-то вроде SpreadsheetGear.

Я нашел интересную статью В Microsoft говорят, что не делайте автоматизацию Office.

Получить установочные материалы от http://www.microsoft. ком / загрузки / details.aspx FamilyID = 59daebaa-bed4-4282-a28c-b864d8bfa513 & амп;? DisplayLang = ен

установите его в своей системе и используйте Excel dll в своем решении, и, надеюсь, он будет работать.

У вас есть основные сборки взаимодействия, установленные на сервере? Обычно они находятся в GAC и не включаются в каталог bin при сборке программы, поэтому их необходимо будет установить локально на сервере.

Это всего лишь предположение, но это может быть UAC. Я знаю, что привилегированные (административные) приложения и пользовательские приложения не могут отправлять сообщения друг другу или общаться каким-либо образом. Ваш сервис работает как администратор, но ваш рабочий стол работает как обычный пользователь под UAC, даже если это один и тот же пользователь. Я также ожидаю, что Office запускает (предварительно загружает) свои части при запуске и будет работать как обычный пользователь.

Попробуйте отключить UAC и посмотрите, поможет ли это. Если это так, по крайней мере, вы знаете, что это такое.

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

Что нужно помнить о Office. Это только x86, поэтому, если вы создаете приложение в x64, вы не сможете получить доступ к базовым COM-объектам Office. Вам нужно будет скомпилировать ваше приложение в x86, тогда оно будет работать.

Вы можете сделать это, перейдя в свойства вашего проекта и выбрав x86 на вкладке сборки в Visual Studio.

Все это предполагает, что ваше приложение разрабатывается / запускается в среде x64.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top