Страница: 1 | 2 |
Вопрос: DLL в VB.NET 2005
Добавлено: 21.06.06 17:20
Автор вопроса: ZXC
Собственно как юзать DLLки в vb.net? можно простенький пример? например есть форма, ложем в папку с этой формой DLLку в которой будет переменная например со значением "работает" и при загрузке формы считываем в текстовое поле эту переменную, кто знает расскажите как считывать из DLLки? Спасибо
Ответы
Всего ответов: 26
Номер ответа: 1
Автор ответа:
student-uni
Вопросов: 122
Ответов: 257
Профиль | | #1
Добавлено: 21.06.06 17:24
Подключать как ресурсы, Опции, РЕсурс подключить, указать путь, всё как и в вб6 оцхы
Тогда ты в експлорере проекта (справа вверху) видишь этот ресурс и можешь ссылаться на его классы, т е объявить объект типа такого что описан в твоей дллке
Номер ответа: 2
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #2
Добавлено: 21.06.06 17:51
маленькая поправка.. References
Делается это через свойства проекта на вкладке References. Нажимаешь там кнопку Add, указываешь путь к своей DLL, и после этого тебе будет доступно все, что есть в твоей DLL..
И используешь как обычные классы..
Номер ответа: 3
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #3
Добавлено: 22.06.06 00:06
Чото я не понял....нувот создал DLLку прикрепил к проекту, в DDLке написал
и теперь как при загрузке формы проекта считать эту перменную (primer) в текстовое поле? :
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 22.06.06 00:26
а чо тут не понятного?
у тебя объявлено Dim.. что равносильно Private... намек понял???
и второй момент.. не забудь импортировать пространство имен...
Номер ответа: 5
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #5
Добавлено: 22.06.06 09:22
нет
это как?
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 22.06.06 14:56
))))
Ну раз намека ты не понял, тогда объясняю... есть такое понятие - Зона видимости переменной..
она может быть
Private
Protected
Friend
Protected Friend
Public
У тебя переменная объявлена как Dim, что равносильно Private.. Другими словами - это закрытая (частная) переменная, которая будет доступна только на том уровне, где ты её объявил.. Это может быть на уровне класса, модуля процедуры, формы .. и т.д.. НО НИКАК НЕ ИЗ ДРУГОГО МЕСТА!!!!
Говоря еще проще.. тебе её надо было объявить как Friend или Public.. тогда она будет видна для всего проекта в целом..
Что касается DLL и пространства имен, то примерчик накидаю чуть позже, ибо объяснять на пальцах это очень долго...
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 22.06.06 18:27
'// у меня она называется SampleDLL( по умолчанию имеет название ClassLibrary1)
'// Это называется пространство имен, которое можно и не использовать,
'// но считается правилом хорошего тона в программировании, так как
'// позволяет избежать путаницы с названием классов и облегчает чтение кода..
'// К примеру: у тебя в проекте есть 2 класса с одинаковы названиями
'// и вот чтобы их можно было различить, используют пространство имен..(Namespace)
Namespace Sample
'// По-умолчанию, в проекте DLL (Class Library) создается класс
'// с названием Class1.. я переименовал его в Test для удобства
Public Class Test
Public Shared ReadOnly Primer As String = "Hello from my first DLL"
Public Const CAPTION As String = "Special for " & MY_NAME
'// Эта константа объявлена как Private, значит за пределами этого
'// класса она будет недоступна
Private Const MY_NAME As String = "ZXC"
#Region " Public Property Name "
Private _name As String = ""
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal Value As String)
_name = Value
End Set
End Property
#End Region
Public Shared ReadOnly Property PI() As Double
Get
Return Math.PI
End Get
End Property
End Class
End Namespace
'// Просто для сравнения привожу пример другого класса
'// без использования Namespace
Public Class API
Private Declare Function Beep Lib "kernel32.dll" (ByVal dwFreq As Int32, _
ByVal dwDuration As Int32) As Int32
'// Воспроизводим звук с указанной частотой и длительностью...
Public Shared Sub BeepSound(ByVal dwFreq As Int32, ByVal dwDuration As Int32)
Beep(dwFreq, dwDuration)
End Sub
End Class
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 22.06.06 18:32
Затем откомпилируй DLL, закрой проект и создай новый (стандартный с формой). Подключи к этому проекту эту DLL .. на форму положи 4 кнопки.. далее скопируй этот код..
'// На форму положи 4 кнопки...
'// Импортируем пространство имен
Imports SampleDLL.Sample
Public Class Form1
'// Пример #1
'// - Вызов константы CAPTION
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'// Поскольку константа у нас объявлена как Shared, то для её использования
'// создавать экземляр класса (Dim testClass As New Test)не нужно...
'// Просто берем и вызываем
Me.Text = Test.CAPTION
'// Эта константа использует другую - MY_NAME, но отсюда ты ее не сможешь использовать
'// так как она у нас объявлена как Private
End Sub
'// Пример #2
'// - Воспроизведение звука... вызов ф-ции из другого класса нашей DLL
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'// Поскольку мы в самом начале НЕ импортировали пространство
'// имен ... (Imports SampleDLL), поэтому путь к ф-ции указываем полностью
For Freq As Int32 = 250 To 750
SampleDLL.API.BeepSound(Freq, 10)
Me.Text = "Частота: " & Freq
Application.DoEvents()
Next
End Sub
'// Пример #3
'// - Вызов строковой переменной Primer
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'// Поскольку она у нас объявлена как ReadOnly (только для чтения) то изменить её ты НЕ сможешь..
'// другими словами она у нас практически тоже самое что и константа
MessageBox.Show(Test.Primer, Test.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information)
'// Если убрать ReadOnly, то ты сможешь сделать так: Test.Primer = "Новое значение"
End Sub
'// Пример #4
'// - получение числа PI
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Me.Text = Test.PI
End Sub
'// Пример #5
'// - использование свойства Name
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
'// Поскольку свойство у нас НЕ помечено как Shared, то для его использования
'// создаем экземляр класса
Dim classFromDLL As New Test
'// после этого можешь использовать его как угодно..
classFromDLL.Name = "Вася Пупкин"
MessageBox.Show("My name is " & classFromDLL.Name, Test.CAPTION, _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 22.06.06 18:34
Ну и в заключении хочу добавить от себя лично.. (набрал полную грудь воздуха)
ЧИТАЙ, БЛИН, КНИГИ!!!!!!!
Номер ответа: 10
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #10
Добавлено: 22.06.06 23:22
эх, разачаровало меня то, что в vb по-прежнему нельзя писать native dll... В vb6 можно было выкрутиться, но там стока мук из-за этого было...
Номер ответа: 11
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #11
Добавлено: 22.06.06 23:24
а хотя этого следовало ожидать - ведь одна из целей .net framework - заменить собою api-интерфейс
Номер ответа: 12
Автор ответа:
ZXC
Вопросов: 30
Ответов: 106
Профиль | | #12
Добавлено: 23.06.06 10:32
Eros спасибо конечно, но вот вопрос один ))Вообщем в DLLке у меня только вот такой код
Public Const Text As String = "Работает!"
End Class
Итак, компилирую я эту DLLку, добавляю в проект, запускаю его и при нажатии на кнопку вызываю вот такой код
и так, всё работает! но! я компилирую форму и в папке появляется эексешник формы и dllка! так вот, я запускаю форму жму кнопку всё работает так надо но когда я перекампилрую DDLку и изменю содержимое переменной Text тоя заменяю старую DLLку новой, Но при нажатии на кнопку мне всё равно в текстовом поле показывается старый текст!!!! и к тому же если я вообще удаляю DLLку из папки и жму на кнопку ошибки НЕТ! и в текстовом поле опять старый текст )))) надеюсь понятно объяснил
Номер ответа: 13
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #13
Добавлено: 23.06.06 14:15
пришла одна мысль - возможно код из dll'ки импортируется в код exe'шника
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 23.06.06 16:06
исключено.. это из области фантастики... )))
Номер ответа: 15
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #15
Добавлено: 23.06.06 16:13
Надеюсь, ты понимаешь, что чудес на свете не бывает???
Значит либо ты не ту библиотеку удалил, либо удалил, но не из той папки.. она может быть как в Debug , так и в Release...
А вообще, если делать по уму, то надо использовать 2 проекта в одном решении.. тогда у тебя тебя всегда будет использоваться свежая копия DLL
Только там один момент... при добавлении ссылки на DLL.. появиться новая вкладка Projects на которой будет отображаться проект твоей DLL.. вот ее и добавишь в референс..
А чтобы не появлялся старый текст, просто обнови ссылку на библиотеку(добавь ее снова).. тогда у тебя будет использоваться новая версия либы..