Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
1

Передача строки на внешний DLL файл

15.09.2018, 07:01. Показов 624. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет форумчане! С помощью такого кода организовал вызов из DLL файла в форму. Проблема заключается в том что из DLL значение возвращает, но записать туда не могу. Может каким нибудь способом можно записать туда данные, чтобы при вызове он вернул ответом записанные данные?! Буду очень благодарен за ответ!

Приложение Form1
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Imports System.IO
Public Class Form1
 
    Dim modules As New List(Of String)
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ListBox1.Items.Clear()
        Dim path As String = "modules"
        If Directory.Exists(path) = True Then
            Dim files As String() = Directory.GetFiles(path, "*.dll", SearchOption.TopDirectoryOnly)
            For Each s As String In files
                ListBox1.Items.Add(s)
                modules.Add(s)
            Next
        End If
    End Sub
 
    Public Sub EnterDLL(ByVal LastPath As String)
        Dim assemblyFile As String = IO.Path.Combine(Application.StartupPath, LastPath)
        Dim _assembly = Reflection.Assembly.LoadFile(assemblyFile)
        Try
            Dim _type = CType(_assembly.GetExportedTypes.GetValue(0), Type)
            With _type
                Dim result = .InvokeMember("NAME_1", Reflection.BindingFlags.InvokeMethod, Nothing, _type, Nothing)
                TextBox1.Text = result
            End With
            Dim _type2 = CType(_assembly.GetExportedTypes.GetValue(0), Type)
            With _type2
                Dim result = .InvokeMember("NAME_2", Reflection.BindingFlags.InvokeMethod, Nothing, _type2, Nothing)
                TextBox2.Text = result
            End With
            Dim _type3 = CType(_assembly.GetExportedTypes.GetValue(0), Type)
            With _type3
                Dim result = .InvokeMember("NAME_3", Reflection.BindingFlags.InvokeMethod, Nothing, _type3, Nothing)
                TextBox3.Text = result
            End With
        Catch ex As Exception
            TextBox1.Text = "Неизвестный модуль"
            TextBox2.Text = ""
            TextBox3.Text = ex.Message
        End Try
    End Sub
    Private Sub LisACT(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        EnterDLL(modules(ListBox1.SelectedIndex))
    End Sub
 
End Class
DLL
VB.NET
1
2
3
4
5
6
7
8
9
10
11
Public Class Class1
    Shared Function NAME_1()
        Return "Данные1"
    End Function
    Shared Function NAME_2()
        Return "Данные2"
    End Function
    Shared Function NAME_3()
        Return "Данные3"
    End Function
End Class
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2018, 07:01
Ответы с готовыми решениями:

Передача блока данных их страницы во внешний файл через ajax
Не знаю как правильно описать, но суть задачи в том что надо часть страницы через селектор передать...

Передача данных из программы во внешний файл и из внешнего файла в программу
Например, нужно записать во внешний файл несколько чисел, а потом считать эти числа из внешнего...

Передача с Dll в ЕХЕ файл.
проблема с dll Как месяц Delphi поставил, поэтому мало чего шарю в нем. я создал DLL с ресурсами...

Передача структуры в dll валит ЕХЕ файл.
Имеется структура в VB Type ST Field1 As String Field2 As Long Field3 As String ...

18
1530 / 1478 / 322
Регистрация: 03.10.2012
Сообщений: 1,517
15.09.2018, 13:07 2
BIXTAR, если я правильно вас понял, попробуйте так:

Код DLL
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Public Class Class1
    Dim name1 As String = "Данные1"
    Dim name2 As String = "Данные2"
    Dim name3 As String = "Данные3"
 
    Public Function GetNAME_1() As String
        Return name1
    End Function
    Public Function GetNAME_2() As String
        Return name2
    End Function
    Public Function GetNAME_3() As String
        Return name3
    End Function
 
 
    Public Sub SetNAME_1(ByVal s As String)
        name1 = s
    End Sub
    Public Sub SetNAME_2(ByVal s As String)
        name2 = s
    End Sub
    Public Sub SetNAME_3(ByVal s As String)
        name3 = s
    End Sub
End Class
В классе формы напишите функцию подобную вашей для вызова методов SetNAME_
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
15.09.2018, 20:31  [ТС] 3
MrCrown,

Необработанное исключение типа "System.MissingMethodException" в mscorlib.dll

Дополнительные сведения: Попытка доступа к отсутствующему члену.


Он не вызывался с самого начала, когда уровень доступа был Public в классе DLL. При уровне Shared работает, но нет доступа к содержимому за её пределами
0
1530 / 1478 / 322
Регистрация: 03.10.2012
Сообщений: 1,517
17.09.2018, 10:35 4
BIXTAR, не понятно, к чему такие сложности. Почему бы не воспользоваться возможностями ООП и не создать объекты из вашей библиотеки и работать с ними.
1
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
17.09.2018, 19:25 5
Цитата Сообщение от MrCrown Посмотреть сообщение
Почему бы не воспользоваться возможностями ООП и не создать объекты из вашей библиотеки и работать с ними.
Я по простоте своей душевно всё время думал, что библиотеки нужны, скажем так, в режиме readonly. Зачем вообще в dll-ку заносить какую-то информацию? И если даже нужно занести, значит ты знаешь её структуру, одним словом ты - автор сего чуда, так зачем тогда использовать этот кусок кода в виде отдельной dll?

PS Это просто вопросы, если кто-нибудь на них ответит - буду признателен, и возможно, стану чуть умнее.
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 05:40  [ТС] 6
_Radik_, допустим ты прав, библиотека и работает в режиме ReadOnly и я хочу вот инициализировать COM порт, примерно так, пусть даже без потока:

DLL:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Imports System.Threading.Thread
 
Public Class Class1
    Shared WithEvents SerialPort1 As New System.IO.Ports.SerialPort
    Shared Function SetNAME_1()
        Dim ThreadSP As New System.Threading.Thread(AddressOf Class1.OpenPort)
        ThreadSP.Start()
        Return OpenPort()
    End Function
    Shared Function OpenPort()
        SerialPort1.PortName = "COM1"
        SerialPort1.BaudRate = "9600"
        SerialPort1.StopBits = IO.Ports.StopBits.One
        Return "PORT OPENED"
    End Function
    Shared Function SetNAME_2()
        Return "Privet"
    End Function
    Shared Function SetNAME_3()
        Return "Privet3"
    End Function
End Class
Вдруг мне не понравился этот номер COM порта и нужно его заменить, я просто не поверю что что его нельзя поменять, либо как вариант чтобы DLL сам запрашивал номер порта у класса формы, но не знаю как это сделать.

PS. К чему я это всё. У меня нет особого желания постоянно переписывать класс формы при добавлении новой функции, проще создавать новые модули и кидать их в папку, а потом через приложение добавлять их в список и работать с ними

Добавлено через 33 минуты
Ещё нашел как вариант. Класс формы генерирует текстовый файл и с указанием с наименования порта, а DLL файл с помощью ридера читает этот текстовый файл и открывает порт.
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 09:01 7
А сделать в этом классе public переменную нельзя разве?

Добавлено через 36 минут
Цитата Сообщение от BIXTAR Посмотреть сообщение
Он не вызывался с самого начала
Кто "он"?
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 09:42  [ТС] 8
_Radik_,

VB.NET
1
2
3
Shared Function NAME_1()
        Return "Данные1"
End Function
"Он", не знаю как назвать, член класса по моему.

При уровне доступа Public там вообще ничего не работает, можешь сам проверить, всё через Shared идет, может через поток ещё пойдет, хотя не пробовал ещё.
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 12:17 9
Цитата Сообщение от BIXTAR Посмотреть сообщение
При уровне доступа Public там вообще ничего не работает, можешь сам проверить
Проверил, конечно может мы до сих пор о разных вещах говорим, но вот скрины.

За качество фото извиняюсь, т.к. на планшете не нашел кнопку PrintScreen.
На первом фото Библиотека классов
Передача строки на внешний DLL файл

На втором - программа
Передача строки на внешний DLL файл

На третьем - результат
Передача строки на внешний DLL файл
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 14:31  [ТС] 10
_Radik_,
PS. К чему я это всё. У меня нет особого желания постоянно переписывать класс формы при добавлении новой функции, проще создавать новые модули и кидать их в папку, а потом через приложение добавлять их в список и работать с ними
Ты это сделал через стандартный метод VS. Попробуй подключить библиотеку без перезаписи класса формы, когда у тебя папка с кучей модулей находится где попало, пусть даже в корне диска С, а название конкретного файла dll может в любой момент поменяться.
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 17:40 11
BIXTAR,
Цитата Сообщение от BIXTAR Посмотреть сообщение
Попробуй подключить библиотеку без перезаписи класса формы
, тогда может быть так, как указано в примерах на MSDN:
вот ссылка https://docs.microsoft.com/ru-... #overloads
библиотека класса:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Class MyType
    Private myField As Int32
    Public Sub New(ByRef x As Int32)
        x *= 5
    End Sub
    Public Overrides Function ToString() As [String]
        Return myField.ToString()
    End Function
    Public Property MyProp() As Int32
        Get
            Return myField
        End Get
        Set(value As Int32)
            myField = value
        End Set
    End Property
End Class
Программа:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
 Private Sub EnterDll()
        Dim LastPath As String = "D:\ClassLibrary1.dll"
        Dim assemblyFile As String = IO.Path.Combine(Application.StartupPath, LastPath)
        Dim _assembly = Reflection.Assembly.LoadFrom(assemblyFile)
        Dim t = _assembly.GetTypes.GetValue(5)
        Dim args As [Object]() = New [Object]() {8} ' Этот аргумент можно установить через конструктор библиотеки
        Dim obj As [Object] = t.InvokeMember(Nothing, BindingFlags.DeclaredOnly Or BindingFlags.[Public] Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.CreateInstance, Nothing, Nothing, args)
        Dim v As Int32 = DirectCast(t.InvokeMember("myField", BindingFlags.DeclaredOnly Or BindingFlags.[Public] Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetField, Nothing, obj, Nothing), Int32)
        t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.[Public] Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, Nothing, obj, New [Object]() {9}) ' 9 - то число, которое устанавливаем.
        v = DirectCast(t.InvokeMember("MyProp", BindingFlags.DeclaredOnly Or BindingFlags.[Public] Or BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.GetProperty, Nothing, obj, Nothing), Int32)
        MsgBox("MyProp: " & v)
    End Sub
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 17:59  [ТС] 12
_Radik_, это тоже самое что и у меня, если даже попробуешь собрать по этому же коду, он тебе исключение выдаст:

Необработанное исключение типа "System.MissingMethodException" в mscorlib.dll
Дополнительные сведения: Попытка доступа к отсутствующему члену.


Заменишь все на Shared, ошибки такой не будет.

К тому же я уже нашел решение всего этого, лучший способ присваивать значения модулю через текстовый файл с помощью ридера.
0
1496 / 1044 / 146
Регистрация: 01.10.2009
Сообщений: 3,510
Записей в блоге: 1
18.09.2018, 18:03 13
Цитата Сообщение от BIXTAR Посмотреть сообщение
лучший способ присваивать значения модулю через текстовый файл с помощью ридера
кто назвал этот способ взаимодействия с библиотекой лучший?
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 18:03 14
Это не тоже самое и это работает, т.к. я сам сейчас это проверил
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 18:06  [ТС] 15
XIST, я не придираюсь к вопросам. Как говорится, знаешь способ лучше, предложи.
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 18:08 16
Ни каких ошибок и исключений не выдает
Но, тип я беру не под номером 0 как у тебя, а под номером 5
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
18.09.2018, 18:34  [ТС] 17
_Radik_, не стал подробно разбираться, всё же как то много кода для одного вызова
0
82 / 72 / 15
Регистрация: 18.01.2014
Сообщений: 348
18.09.2018, 18:53 18
BIXTAR, Я хз, хз... Там всего 1 строчка добавилась относительно твоего когда - строка №7.
Строку №6 можно убрать и в 7-ой в конце вместо args поставить Nothing, если в библиотеки убрать Public Sub New.
Строки №8, 10, 11 - только для того чтобы проверить результат, действительно ли Свойство MyProp у dll-ки изменилось.
0
0 / 0 / 0
Регистрация: 21.03.2017
Сообщений: 24
19.09.2018, 11:46  [ТС] 19
Всем спасибо кто отозвался! Чтение значений из файла, этого достаточно.

Тема закрыта!.
0
19.09.2018, 11:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2018, 11:46
Помогаю со студенческими работами здесь

Передача файла или строки в файл на сервер PHP
Добрый день господа. Я работаю на стороне веб сервера PHP (хостинге) и дал доступ на запись в файл...

передача информации на внешний жесткий диск
Здравствуйте, нужна подсказка. В одной комнате стоит ПК, в другой телевизор samsung, все соединено...

Как вернуть значение процедуры из DLL во внешний модуль?
Как вернуть значение процедуры из DLL во внешний модуль?

Ссылка на неразрешенный внешний символ при использовании DLL
Всем привет. Подскажите пожалуйста, как работать с DLL... Я создаю новый проект с разрешением...

Файл: Создайте текстовый файл, содержащий в начале каждой строки гласные буквы соответствующей строки файла, а в конце строки - согласные
Создайте текстовый файл, содержащий в начале каждой строки гласные буквы соответствующей строки...

Как множество dll собрать в один dll или exe файл?
Сделал тестовый проектик по работе с БД (Entity Framework), скомпилировал и как глянул в папку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru