Неправильный объект, возвращенный из вызываемой оболочки 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 каким-то образом имеет тип "Неправильный.Введите" вместо "Foo.Bar".
"Неправильно.Тип" также есть в сборке, поэтому я предполагаю, что что-то идет не так с библиотекой типов, но я попытался выполнить регенерацию (используя regasm / codebase / tlb MyLib.dll), и это не помогло.
Я не знаю, как диагностировать это дальше.Надеюсь, кто-нибудь сможет перечислить некоторые шаги по диагностике такого рода проблем?
Решение 2
В этом случае удаление ссылки на файл tlb, а затем добавление его снова решило проблему
К сожалению, я так и не нашел общего решения или объяснения такого поведения.
Другие советы
Это может быть проблема с автоматически сгенерированными идентификаторами GUID (класс, интерфейс, библиотека типов) - когда вы меняли DLL, идентификаторы GUID менялись.Поскольку старый TLB использовал старые идентификаторы GUID, ссылаясь на него, вы связали эти старые идентификаторы GUID с именами типов, поэтому код не смог работать с новыми идентификаторами GUID.Большинство кодов на VB (6 и .NET), с которыми я сталкивался, имеют эту проблему, поэтому, если ваша DLL написана на VB, вероятно, это так (и ваша работа вокруг подтверждает эту теорию).
Если проблема в этом, то общим решением является явная настройка GUID, что немного раздражает, если у вас много типов, поскольку предполагается, что вы должны изменять GUID по мере изменения ваших версий, и вам придется делать это вручную.