C ++ вызывает C # COM-ошибка взаимодействия: HRESULT 0x80131509 - PullRequest
1 голос
/ 01 февраля 2012

Я создаю взаимодействие C # COM для вызова C ++. Я зарегистрировал файл DLL и TLB по regasm. все идет хорошо, пока однажды я не изменил код части C # (я не изменил определение интерфейса, просто изменилась реализация). один интерфейс в COM возвращает ошибку 0x80131509. Странно то, что это происходит только на некоторых компьютерах (мой рабочий компьютер работает хорошо, поэтому я не могу отладить эту проблему). Я не совсем понимаю, как C # COM работал с C ++, после того, как я их зарегистрировал, я просто знаю, что они создают значение ключа в реестре окна (например, что генерирует regasm / regfile). Как C ++ знает, где находится COM DLL (переменные окружения пути поиска)? а что за использование tlb файла во время выполнения?

есть предложения?

Ответы [ 3 ]

1 голос
/ 05 июля 2018

Я получил ту же ошибку, как только я ввел простую иерархию наследования в мою библиотеку COM. Быстрое разрешение было , для атрибута ComVisible установлено значение true для базового класса . Это немедленно решило мою проблему.

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

Рискну предположить, что истинной причиной ошибки является разорванная цепочка конструктора, но я не буду больше ее изучать.

0 голосов
/ 22 октября 2014

Я получил то же сообщение об ошибке при вызове COM-объекта .Net4 C # из Visual FoxPro.

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

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

0 голосов
/ 01 февраля 2012

Я думаю, что ваша проблема связана с реестром ... Вы должны попытаться отменить регистрацию и зарегистрировать (используя regasm) вашу dll на компьютерах, на которых возникла эта проблема.

Если это не сработает, незарегистрируйте dll на этих компьютерах, затем используйте regedit для поиска и удаления любых недостающих ключей реестра, которые ссылаются на него, после этого снова зарегистрируйте dll.Вы также можете использовать одну из этих программ очистки реестра после удаления недостающих ключей, чтобы гарантировать, что вы ничего не пропустили.

Помните, что вы должны всегда регистрировать dll в каталоге, который будет использоваться вашим приложениеми это должно произойти только один раз.Если вам нужно отменить регистрацию DLL, то вы всегда должны делать это в том же каталоге, который вы использовали для регистрации.Другими словами, как только dll зарегистрирована , не перемещайте ее .

Примечание: если ваша dll не находится на том же пути, что и ваше приложение C ++, она должна находиться в каталоге, на который ссылаетсяв переменной окружения PATH.

...