Неправильный объект возвращен из вызываемой оболочки COM

Я только что обновил DLL, которая вызывается из VBA в Powerpoint. Вся разработка прошла нормально, но когда я попытался развернуть на другой машине пользователя, я столкнулся с проблемой, которую я не знаю, как отлаживать.

Что происходит, так это то, что когда объект .Net создается в VBA, возвращаемая ссылка относится к неправильному объекту, поэтому следующая строка завершается с ошибкой, а метод не найден.

Dim myObj As Foo.Bar

Public Sub RefreshData()

//'instantiate object
Set myObj = New Foo.Bar   
//'call a method
myObj.HelloWorld

Последняя строка завершается с ошибкой Ошибка времени выполнения «438». Объект не поддерживает это свойство или метод, что вызвано тем, что myObj каким-то образом имеет тип «Wrong.Type» вместо «Foo. Бар".

«Wrong.Type» также находится в сборке, поэтому я предполагаю, что что-то не так с библиотекой типов, но я попытался восстановить ее (используя regasm /codebase /tlb MyLib.dll), и это не помогло.

Я не знаю, как диагностировать это дальше. Надеюсь, кто-то там может перечислить некоторые шаги о том, как диагностировать такого рода проблемы?


person Modan    schedule 28.08.2009    source источник
comment
В этом случае удаление ссылки на tlb-файл, а затем его повторное добавление решило проблему. Мне все еще интересно узнать, на что я мог бы обратить внимание, чтобы помочь диагностировать проблему, хотя, копаясь вслепую, я в конце концов нашел решение.   -  person Modan    schedule 28.08.2009
comment
У меня аналогичная проблема, но при создании экземпляра собственного класса VBA нет ссылки на добавление/удаление (см. здесь: stackoverflow.com/questions/2677091/) - вы продвинулись дальше в диагностировать это, и если да, то какие-либо предложения? Спасибо!   -  person Jon Artus    schedule 23.04.2010
comment
@Modan: вы можете ответить на свой вопрос, а затем принять свой собственный ответ, чтобы показать, что вы нашли то, что ищете.   -  person adamleerich    schedule 15.09.2011


Ответы (2)


Это может быть проблема с автоматически сгенерированными идентификаторами GUID (класс, интерфейс, библиотека типов) - когда вы изменили DLL, идентификаторы GUID изменились. Поскольку старый TLB использовал старые идентификаторы GUID, ссылаясь на него, вы связывали эти старые идентификаторы GUID с именами типов, поэтому код не работал с новыми идентификаторами GUID. Большинство кодов VB (6 и .NET), с которыми я столкнулся, имеют эту проблему, поэтому, если ваша DLL написана на VB, вероятно, это так (и ваш обходной путь поддерживает эту теорию).

Если это проблема, общим решением является явная установка идентификаторов GUID, что немного раздражает, если у вас много типов, поскольку вы должны менять идентификаторы GUID по мере изменения вашей версии (версий), и вам придется сделать это вручную.

person srdjan.veljkovic    schedule 29.01.2015

В этом случае удаление ссылки на tlb-файл, а затем его повторное добавление решило проблему.

К сожалению, я так и не нашел общего решения или объяснения поведения.

person Modan    schedule 14.10.2011
comment
Я бы проверил различные GUID для типов и библиотек и всех интерфейсов, в частности, посмотрел на типы Wrong.Type и Foo.Bar и их интерфейсы. - person Arafangion; 08.08.2013