Вызов c # .dll из собственного кода Visual C ++ - PullRequest
2 голосов
/ 21 сентября 2010

система, с которой я работаю, состоит из:

  • Внешнее приложение, написанное, скорее всего, на VB или на VC ++ (не знаю, не знаю и не может иметь исходников для него)
  • Неуправляемый VC ++ .dll
  • A C # .dll

Приложение вызывает первую dll, первая dll вызывает разные методы из второй.
Чтобы первая dll могла видеть и вызывать код C #, я следовал этому руководству: http://support.microsoft.com/kb/828736
Единственное отличие состоит в том, что я не компилирую с / clr: OldSyntax, если я это сделаю, то при изменении других зависимых параметров компиляции первая dll загружается из приложения неправильно.

Все компилируется; изначально вся установка работала нормально, однако после полной разработки кода для двух библиотек я теперь получаю сообщение об ошибке в приложении. Ошибка:

Ошибка времени выполнения '-2147417848 (80010108)':
Ошибка автоматизации
Вызванный объект отключился от своих клиентов.

И происходит, когда в первой dll выполняется следующая строка:

MyManagedInterfacePtr ptrName(__uuidof(MyManagedClass));

Я попытался воспроизвести полностью рабочую настройку, но безуспешно.

Любые идеи о том, как, черт возьми, мне удалось сделать это в первую очередь? Или, альтернативно, о других подходах к совместной работе двух библиотек?

Заранее спасибо!

1 Ответ

1 голос
/ 21 сентября 2010

Это низкоуровневая ошибка COM, связанная с RPC.Это обычно используется на внепроцессных серверах, но это не похоже на ваши настройки.Это также будет использоваться, если вы делаете вызовы на интерфейс COM из другого потока.Одной из возможных причин является то, что потоку, создавшему COM-объект, было разрешено выйти, вызвав CoUninitialize и разрушив COM-объект.Последующий вызов из другого потока вызовет эту ошибку.Это может привести к неправильному счету ссылок (слишком частому вызову Release).

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

...