2012-02-01 2 views
1

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

любое предложение?

ответ

0

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

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

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

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

+2

Спасибо за ваш ответ. Сегодня я вошел в проблемный ПК и, наконец, нашел причину, по которой все идет не так. это из-за того, что C# COM-часть выбрала исключение, но я ее не поймал. причина, по которой я не могу воспроизвести, что они подключаются к базе данных различий. – ArdenZhao

0

У меня получилось такое же сообщение об ошибке, когда я вызывал COM-объект .Net4 C# из Visual FoxPro.

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

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

Смежные вопросы