Вызов 32-битного COM из c # в 64-битном режиме - PullRequest
9 голосов
/ 28 июля 2011

У меня есть сторонний COM-объект (32-битный), который мне нужно вызвать из моего приложения c # (64-битный). Я знаю, что должен запустить объект COM в отдельном процессе. В этом COM-объекте реализовано много классов, поэтому я стараюсь избегать написания собственной оболочки удаленного взаимодействия, которая предоставляет все методы. COM + кажется наиболее простым решением. Я открыл меню «Службы компонентов», создал новое приложение COM +, добавил свой COM-объект в качестве компонента в это приложение. Казалось, все прекрасно импортируется.

В моем приложении на C # я добавил исходный COM-объект в качестве ссылки (который автоматически генерирует библиотеку типов). Используя ссылку на библиотеку типов, я могу создавать объекты из компонента COM + (я вижу, что они начинают вращаться в окне Службы компонентов), но когда я пытаюсь получить доступ к методам объекта, я получаю сообщение об ошибке, сообщающее об интерфейсе не зарегистрирован.

У кого-нибудь есть подсказка? Я вернулся и запустил regsvr32 на COM-объекте, но я не думаю, что это было необходимо, и это не помогло. Правильно ли мое использование в C #? У автозаполнения VS2008 не было проблем с просмотром этих методов.

Точное исключение: «Интерфейс не зарегистрирован (исключение из HRESULT: 0x80040155)»

Неясно, что конкретно представляют собой разрешения и роли в Службах компонентов, я попытался настроить удостоверение объекта COM + для запуска под Системной учетной записью как в качестве локальной службы, так и в качестве интерактивного пользователя. Я добавил каждого пользователя в роли. Все работает локально, поэтому не должно быть проблем с правами доступа к файлам или чем-то подобным.

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

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

У нас была похожая ситуация, при работе с COM dll от VFP.

Все зависит от прав и разрешений, как говорит Яхья. Мы получили это, сделав это:

  • Установите драйверы VFP oledb 9 (не знаю, что у вас, вероятно, не требуется).
  • дать сетевому сервису IIS_IUSR полный контроль над папкой COM (требуется, чтобы DLL могла выполнять некоторые записи в своей собственной папке при вызове с веб-сайта).
  • запустите regsvr32.exe "c: \ xxx \ yourfile.dll" -> это должно быть успешно!
  • Создание приложения COM + и добавление DLL как части
  • Установите учетные данные COM + приложения на пользователя с достаточными правами

и нам нужно было сделать еще несколько настроек для прав в пуле приложений / IIS, но это не требуется для вас, я думаю.

В любом случае, просто убедитесь, что у вас достаточно логов, убедитесь, что dll зарегистрирована, и после этого все о правах на права.

Удачи с этим!

1 голос
/ 28 июля 2011

Извините, что использую «Ответить» для ответа на комментарии, но, похоже, это мой единственный путь.

Вся цель перехода на 64-битную операционную систему состояла в том, чтобы получить дополнительное адресуемое пространство памяти, поэтомузапуск всего приложения в 32-битном режиме - это не вариант.

Это может иметь отношение к проблеме, заключающейся в том, что после успешного создания трех объектов класса я смог установить свойства в одном, вызвать метод без аргументов вво-вторых, но он вызывал метод в третьем, который принимал два других объекта в качестве аргументов, которые вызывали исключение.

...