Использование COM DLL, написанной на NET в vb6.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 12.11.2008 (Ср) 13:43

Поиск дал тему:
viewtopic.php?f=2&t=10462&start=0&st=0&sk=t&sd=a&hilit=com+dll+net
Не стал некрофильствовать, слишком она старая.
gaidar писал:
Для этого на .NET можно написать COM компонент, связывающий с VB6 - вот и все . Делается это установкой одной галки в свойствах проекта - и все, сборка доступна как COM

Если речь шла про COM Visible, то это ничего не дает. точнее DLL работает, если ее использовать из другого NET проекта, а из vb6 ее не видно, ее не видит даже regsvr32. Что делать?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Williams » 12.11.2008 (Ср) 13:55

Регистрируй при помощи regasm. Будет видна в References.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 14.11.2008 (Пт) 11:17

Зарегистрировал, пишет, что регистрация прошла успешно, однако в списке References vb6 не появляется, если нажать Browse, найти и попытаться подключить, пишет, что не удается.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Williams » 14.11.2008 (Пт) 12:54

Может быть есть еще какая-то деталь. Посмотри готовый проект - присоединил. Под 2008 студию.
Вложения
vb6lib.zip
(34.03 Кб) Скачиваний: 55
И вы думаете, что вас оставят в живых после прочтения этого поста?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 15.11.2008 (Сб) 15:38

Что-то не идет.
Открыть не удается - у меня VS2005, но 2008-е проекты (не солюшн, а vbproj) открывал без проблем, а тут ищет какой-то присоединенный файл.
Но даже та DLL, что лежит в Release, без проблем регистрируется в regasm, но не видется в VB6.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 16.11.2008 (Вс) 11:08

Итак, создаю в NET проект типа DLL. Делаю у класса свойство ComClass=True, ComVisible у класса и так True. Захожу в свойства проекта и делаю AssemblyComVisible=True.
Далее Williams подсказал. Нужно было использовать RegAsm с ключем "/tlb".
В списке References появляется моя библиотека, вижу Public классы, их методы, параметры методов, вижу структуры.
Но кроме структур ничего применить не удается. На "New" происходит Automation Error.
У кого-нибудь есть рабочий пример?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Nord777 » 16.11.2008 (Вс) 13:27

а если повесить атрибут?
Код: Выделить всё
<ComClass()> Public Class AnyClass
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 17.11.2008 (Пн) 10:41

Nord777
Так я же написал:
Делаю у класса свойство ComClass=True

При этом атрибут появляется автоматически, только полным синтаксисом:
<Microsoft.VisualBasic.ComClass()>

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Sebas » 17.11.2008 (Пн) 18:05

Mikle писал(а):Nord777
Так я же написал:
Делаю у класса свойство ComClass=True

При этом атрибут появляется автоматически, только полным синтаксисом:
<Microsoft.VisualBasic.ComClass()>


а лучше все глобальные идентификаторы самому указать, и не забудь PUBLIC NEW явно указать! без параметров!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 18.11.2008 (Вт) 14:58

Sebas
Код в vb.net:
Код: Выделить всё
Public Module modUtil
  <ComClass()> Public Class cTest
    Public Function Test(ByVal a As Single) As Single
      Test = 1 / a
    End Function

    Public Sub New()
      MsgBox("New")
    End Sub
  End Class
End Module


Код в vb6:
Код: Выделить всё
Option Explicit

Dim x As cTest

Private Sub Form_Click()
  Set x = New cTest
  MsgBox x.Test(2)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  Set x = Nothing
End Sub

На строке "Set x = New cTest" влетает с Automation Error.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Sebas » 18.11.2008 (Вт) 17:21

а зачем в модуле?!?!?!?!?!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Sebas » 18.11.2008 (Вт) 17:27

Код: Выделить всё
<System.Runtime.InteropServices.Guid("3430126F-9DBB-4870-ABAC-09A6DD7B35F1")> _
<System.Runtime.InteropServices.ComVisible(True)> _
_
Public Class ContentSink

    Public Sub New()
        MyBase.New()
    End Sub

...


я вот так делаю.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 19.11.2008 (Ср) 10:26

Модуль - это остатки экспериментов, сначала без него было.
Твой вариант попробую, спасибо.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 20.11.2008 (Чт) 10:40

Все осталось, как прежде. Наличие-отсутствие модуля ничего не меняет.
В последнем примере нет атрибута "<ComClass()>". Если его вставить - сообщает о конфликте с атрибутом "<System.Runtime.InteropServices.Guid("3430126F-9DBB-4870-ABAC-09A6DD7B35F1")> "
Может есть у кого-нибудь рабочий пример?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Использование COM DLL, написанной на NET в vb6.

Сообщение Mikle » 24.01.2009 (Сб) 14:41

Разобрался. Раньше в VS2005 это не работало, установил VS2008 - все заработало.
Вопрос вдогонку: можно ли как-то наследовать Enum-ы, передаваемые в COM DLL от Enum-ов NET? То есть, к примеру, я хочу сделать DLL-враппер для System.Drawing. Для Enum System.Drawing.FontStyle приходится писать такое:
Код: Выделить всё
  <ComVisible(True)> Public Enum FontStyle
    Bold = System.Drawing.FontStyle.Bold
    Italic = System.Drawing.FontStyle.Italic
    Regular = System.Drawing.FontStyle.Regular
    Strikeout = System.Drawing.FontStyle.Strikeout
    Underline = System.Drawing.FontStyle.Underline
  End Enum

Я не собираюсь делать враппер на GDI+, просто это удобный пример.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25

    TopList