Tlbimp не удалось создать Interop Dll

Я разработал библиотеку COM на Delphi. Когда я пытаюсь «добавить ссылку» в проект Visual Studio, VS вылетает. Я попытался собрать сборку Interop с помощью tlbimp.exe, и это не удалось:

TlbImp: ошибка TI1000: импортер библиотеки типов обнаружил непредвиденное исключение: System.AccessViolationException - попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Интересно, что когда я «добавляю ссылку» в проект веб-приложения (или веб-сайта), он успешно генерирует Interop dll и добавляет ссылку.

Для меня важно знать, как tlbimp.exe используется в проекте веб-приложения, потому что я хочу настроить создание взаимодействия.


person Bahribayli    schedule 03.05.2014    source источник
comment
Попробуйте TlbImp с открытым исходным кодом, вы можете отладить его: clrinterop.codeplex.com/releases/view/ 17579   -  person noseratio    schedule 04.05.2014
comment
@Noseratio Это была хорошая идея. Я отладил код и обнаружил нарушение прав доступа, когда TlbImp пытается получить описание функции с помощью функции DISPID. У меня не было достаточно времени, чтобы точно определить проблему, но, возможно, это ошибка в TlbImp.   -  person Bahribayli    schedule 06.05.2014
comment
Думаю, лучшее, что вы могли сделать (помимо сообщения об ошибке), - это попытаться изменить интерфейс. вашего компонента Delphi, поэтому он не расстраивает TlbImp.   -  person noseratio    schedule 06.05.2014
comment
@Noseratio Я сообщу об ошибке, как только соберу достаточно информации, чтобы воспроизвести ошибку. Проблема возникает только для одного CoClass. Другие интерфейсы и классы CoClass в порядке.   -  person Bahribayli    schedule 06.05.2014


Ответы (1)


Скорее всего, в вашем коде Delphi есть ошибка. Отладить библиотеку COM в Delphi можно так:

введите описание изображения здесьВыберите run-> параметры ...

введите описание изображения здесь

(Неважно, что здесь написано project28.exe; он работает так же для Projectx.dll)

Обычно я разрабатываю плагины для Excel с помощью COM.
В этом случае мое хост-приложение - Excel.exe.

Когда вы введете эту информацию, вы сможете запустить библиотеку.
Когда вы это сделаете, Delphi запустит хост-приложение и будет ждать, пока оно каким-то образом не вызовет вашу библиотеку.
Если вы это сделаете установили какие-либо точки останова. Delphi приостановит действие и позволит вам отладить.

Поскольку вы знаете, какие функции вы вызываете в своем коде C #, нетрудно увидеть, где установить первую точку останова.

Delphi также сломается при любых исключениях.

person Johan    schedule 03.05.2014
comment
@John, я тестирую и отлаживаю свою COM-библиотеку с помощью хост-приложения (не точечной сети). Моя проблема возникает, когда я добавляю ссылку на приложение dotnet. Ссылка не может быть добавлена, потому что библиотека Interop даже не сгенерирована. - person Bahribayli; 04.05.2014
comment
Попробуйте импортировать библиотеку (созданную вами dll) в Delphi. Если это сработает, возможно, вы сможете использовать файлы, которые Delphi создает в этом процессе на C #. - person Johan; 04.05.2014
comment
@John, я использую Delphi XE, а не Delphi Prism. Поэтому я не думаю, что Delphi сгенерирует какой-либо файл, полезный для C #. Я прав? - person Bahribayli; 04.05.2014
comment
Не уверен, но вы A: узнаете, можно ли вообще импортировать type-lib. B: возможно, можно использовать инструмент для перевода файла Delphi в файл, который будет понимать C #, C: возможно, импортировать файл Delphi в C # напрямую. - person Johan; 04.05.2014
comment
@ Джон, спасибо. Мне удалось использовать библиотеку COM с другими хост-приложениями. По крайней мере, это дало мне некоторое представление. Кстати, когда я добавляю ссылку на приложение веб-сайта в Visual Studio, он успешно генерирует Interop dll, который можно использовать в приложении dotnet. Просто мне интересно, почему это возможно, а наоборот - проблематично. Я не вижу, как tlbimp.exe используется в проекте веб-сайта для создания библиотеки Interop dll. - person Bahribayli; 04.05.2014
comment
Должна быть ошибка в tlbimp.exe - person Johan; 04.05.2014
comment
Я думаю, вы правы. Хотя при отладке TlbImp с открытым исходным кодом я еще не обнаружил точной проблемы, но, возможно, это ошибка в TlbImp.exe. - person Bahribayli; 06.05.2014