2009-08-28 7 views
1

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

Что происходит, когда объект .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.Bar».

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

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

+0

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

+0

У меня такая же проблема, но в создании экземпляра родного класса VBA, поэтому нет ссылку на добавление/удаление (см. здесь: http://stackoverflow.com/questions/2677091/automating-excel-through-the-pia-makes-vba-go-squiffy) - вы получили дальнейшее развитие в диагностике этого и если да, то какие-то предложения? Благодаря! –

+0

@Modan: вы можете ответить на свой вопрос, а затем принять свой собственный ответ, чтобы сообщить, что нашли то, что ищете. – adamleerich

ответ

0

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

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

+1

Я бы проверил различные GUID для типов и библиотеки и всех интерфейсов, посмотрел типы Wrong.Type и Foo.Bar в частности и их интерфейсы. – Arafangion

1

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

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

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

  • Нет связанных вопросов^_^