2010-09-21 2 views
2

система Я работаю с состоит из:Вызов C# .dll из родного Visual C++ код

  • Передний конец приложения, написанные на VB, скорее всего, или еще VC++ (не знаю, дон» т и не может иметь источники для него)
  • неуправляемый VC++ .dll
  • AC# .dll

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

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

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

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

MyManagedInterfacePtr ptrName(__uuidof(MyManagedClass)); 

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

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

Заранее благодарен!

ответ

1

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

Решите, тщательно отслеживая, какие потоки создают COM-объект и как долго они выживают.

+0

Спасибо за ваш ответ, так как для меня невозможно было отладить приложение, вызывающее DLL, я закончил переписывание кода C# на неуправляемый C++. Мне потребовалось пару дней, но в итоге все сработало нормально. – Spookyone