Проблема с вызовом управляемой DLL из кода VB 6 - PullRequest
0 голосов
/ 22 августа 2011

Я перенес код VB6 на VB.Net с помощью мастера преобразования Visual Studio 2008. Портированный код компилируется правильно.

Я проверил опцию компилятора для регистрации COM-взаимодействия на свойствах проекта. При сборке проекта я получаю файл DLL и TLB.

Я зарегистрировал сборку, используя следующую команду

regasm myLib.DLL /tlb:myLib.tlb

После этого я собрал сборку GAC, используя

gacutil /i myLib.DLL

Теперь код VB, который потреблял DLL ...

 Dim myObject
    Set myObject= CreateObject("myLib.MyObject")

.. выдает ошибку -

Ошибка выполнения 429. Компонент ActiveX не может создать объект.

Что мне нужно сделать, чтобы это работало правильно?

Ответы [ 2 ]

1 голос
/ 23 августа 2011
  1. Начиная с основ, вы установили объекты, которые хотели выставить для VB6, как ComVisible? Если я правильно помню, Visual Studio 2008 по умолчанию имеет ComVisible (false) на уровне сборки, где, как и в более ранних выпусках Visual Studio, он использовался по умолчанию в True.

РЕДАКТИРОВАТЬ # 1:

  1. Используете ли вы глубоко вложенное пространство имен или имя сложной сборки? Я обнаружил, что использование соглашения о присвоении имен в стиле mycompany.myproduct.subcomponent для имен сборок и пространств имен смешивается с экспортером типов. Он использует пространство имен для создания левой части программного идентификатора, который вам нужен в VB6.

  2. Какое сообщение выводится при запуске RegAsm? Если он не может найти какие-либо типы для регистрации, он обычно говорит вам.

  3. Проверьте TypeLib и посмотрите, есть ли там типы, которые вы ожидаете увидеть. Вы можете ссылаться на tlb непосредственно из VB6 и нажать F2, чтобы просмотреть TypeLib. Вы можете использовать OLE View, который поставляется с Visual Studio 6.

  4. Вы пытались использовать параметр / codebase при регистрации компонента, чтобы увидеть, не ведет ли он себя по-другому? Я почти всегда использую регистрацию кодовой базы, так как это похоже на обычную регистрацию COM.

1 голос
/ 22 августа 2011

Одна вещь, чтобы проверить, что поймала меня в прошлом: -

Если ваш конструктор на стороне .NET выдает ошибку (независимо от того, обрабатывается она или нет), и вы создаете свой объект в VB6 с помощью CreateObject, вы получаете Runtime Error 429, ActiveX componenet cant create object.

Во время разработки лучше добавить ссылку на ваш управляемый проект и использовать:

Dim myObject
Set myObject = New myLib.MyObject

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

...