C#: ошибка «Невозможно создать компонент Active X» из службы Windows, но не из консольного приложения - PullRequest
3 голосов
/ 14 января 2020

У меня есть windows сервис, написанный на c#, который продолжает слушать один концентратор событий в Azure. Как только сообщение получено, служба обрабатывает его и выполняет некоторые вычисления и вычисления.

Как часть выполнения, он запускает приложение, называемое AutoCal (приложение собственного окна компании), которое является COM-компонентом, аналогичным EXCEL.

Ранее у меня был веб-API, который выполняет те же вычисления / выполнения. При каждом запросе он открывает AutoCal и выполняет некоторую обработку. Я добавил AutoCal dll в качестве ссылки в проекте.

Код для открытия AutoCal выглядит примерно так:

(AutoCal.Application)Interaction.CreateObject("AutoCal.Application.NewInstance").

Когда я тестировал это локально, он получился полностью, как и ожидалось. Но как только я разместил это на сервере, он выдал сообщение об ошибке «Невозможно создать компонент ActiveX». Чтобы исправить это, я дал разрешение открывать компоненты COM в пуле приложений IIS. Это решило мою проблему.

Теперь, когда у меня есть служба windows, которая также открывает AutoCal, откуда я даю разрешения для компонента CO. Я искал это, но везде решение только для ASP. net.

Как исправить эту проблему для windows службы. Любая помощь в этом отношении будет очень полезна. Спасибо.

PS: Когда я написал тот же код в консольном приложении, он работает нормально.

Ответы [ 2 ]

3 голосов
/ 21 января 2020

Без точных журналов ошибок (можете ли вы попытаться найти связанные ошибки в EventViewer?), Трудно сказать, в чем проблема.

Но я бы попробовал следующее:

  1. В меню «Пуск» введите Component services и откройте его (щелкните правой кнопкой мыши - как администратор!)
  2. Go в Component services -> My Computer -> DCOM Config папку

Вы увидите что-то вроде это

DCOM Config

Найдите ваше COM-приложение в дереве. Щелкните его правой кнопкой мыши, откройте свойства, go до Security Tab

Это будет выглядеть так (не берите в голову название вкладки на картинке, в вашем случае это должно быть что-то вроде AutoCal):

COM object properties

Если оно затенено, как в моем случае вы можете использовать следующую процедуру, чтобы изменить настройки вашей системы и сделать эту вкладку настраиваемой:

  1. Go до Start > Run. Введите regedit
  2. Go для ключа, связанного с компонентом DCOM, которым вы хотите управлять: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
  3. Щелкните правой кнопкой мыши по нему. Выберите Permissions
  4. Нажмите Advanced
  5. Измените владельца на Administrator или свою учетную запись пользователя
  6. Нажмите OK
  7. Выберите Full Control для группы Administrators и выбранного вами владельца
  8. Go до Start > Run. Поиск services. Найти COM+ System Application. Щелкните правой кнопкой мыши на сервисе, затем нажмите Restart

Registry tempering

После того, как у вас включена вкладка Security, вы можете изменить разрешения для вашего COM-объекта. Например, вы можете разрешить пользователю, под которым работает ваша служба, получать доступ или активировать этот COM-объект.

Надеюсь, это поможет вам, но, опять же, без какой-либо дополнительной информации об ошибке - это длинный выстрел.

0 голосов
/ 24 января 2020

Возможно, вы захотите запустить его под NETWORK SERVICE, но это не проблема.

Все, что вы испытываете, обобщено в KB257757 .

Соображения по поводу автоматизации Office на стороне сервера

Лучше всего переписать его. Net. Если его базовое значение c, а вы НЕ используете XML, возможно, стоит присвоить этому формату go. Когда-то мы должны были убедиться, что все (все наши клиенты) были на MS Office 2003 (оказалось, что IBM была единственной в 2002 году, и есть плагин для 2002, чтобы читать 2003).

Я знаю это это плохо, и мне жаль быть носителем плохих новостей.

Позиция Microsoft:

Большинство задач автоматизации на стороне сервера включают создание документов или редактирования. Office 2007 поддерживает новые форматы файлов Open XML, которые позволяют разработчикам создавать, редактировать, читать и преобразовывать содержимое файлов на стороне сервера. Эти форматы файлов используют пространство имен System.IO.Package.IO в Microsoft. NET 3.x Framework для редактирования файлов Office без использования самих клиентских приложений Office. Это рекомендуемый и поддерживаемый метод обработки изменений файлов Office из службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...