Подключение к проекту на VB.net модулей с расширением .CS

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

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

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 25.06.2010 (Пт) 18:31

Всем доброго времени суток!

Я как то очень давно читал, что VS2008 позволяет работать в одном проекте с модулями написанными на разных языках в рамках одной студии. Я нашел 3 модуля написаные видимо на C# (расширение у них *.CS и значек отображается C# =) ). В этих модулях написаны нужные мне функции работы с памятью. Я методом перетаскивания засунул их в свой проект. Но как теперь пользоватья этими функциями - не знаю. Они вроде все Public, но из модулей на VB я их не вижу.

Подскажите пожалуйста куда посмотреть, а лучше доступным языком на этом форуме расскажите каким образом можно подключить к проекту на VB.net модули с расширением *.CS.

Заранее благодарен.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение FireFenix » 25.06.2010 (Пт) 19:37

http://www.developerfusion.com/tools/co ... arp-to-vb/
перевести C# в Vb для полноценности и не парится +)
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 25.06.2010 (Пт) 20:20

:D Я тоже нашел этот ресурс.
Просто переживал по поводу ошибок конвертации. И подумал что если исходный код на C# подцепить к проекту, то тогда точно можно не боятся.

Но если вы советуете, значит пологаю хороший конвертер. Буду тестить. Спасибо!

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 25.06.2010 (Пт) 20:46

Подскажите пожалуйста правильно ли я исправил одну ошибку:
Код: Выделить всё
Public Function ReadMemoryString_(ByVal lpBaseAddress As Integer, ByVal hProcess As IntPtr) As String
            Dim cData As Char() = New Char(63) {}
            Dim lpBuffer As Byte() = New Byte(63) {}
            Dim sData As String = ""
            Dim lpNumberOfBytesRead As Integer

            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, lpNumberOfBytesRead)
            Dim c As Integer = -2
            For b As Integer = 0 To 30
                c += 2
                If lpBuffer(c) <> 0 Then
                    cData(b) = BitConverter.ToChar(lpBuffer, c)
                    Try
                        If cData(b) = 32 Then '  "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."

                            sData += "_"
                        Else
                            sData += cData(b).ToString()
                        End If
                    Catch
                    End Try
                Else
                    Exit For
                End If
            Next
            Return sData
        End Function

Если вот эту строку:
If cData(b) = 32 Then ' Выдает ошибку: "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."
Заменить на:
If cData(b) = Chr(32) Then - будет правильно?

На C# эта функция выглядела так:
Код: Выделить всё
public string ReadMemoryString_(int lpBaseAddress, IntPtr hProcess)
        {
            char[] cData = new char[64];
            byte[] lpBuffer = new byte[64];
            string sData = "";
            int lpNumberOfBytesRead;

            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, out lpNumberOfBytesRead);
            int c = -2;
            for (int b = 0; b < 31; b++)
            {
                c += 2;
                if (lpBuffer[c] != 0)
                {
                    cData[b] = BitConverter.ToChar(lpBuffer, c);
                    try
                    {
                        if (cData[b] == 32) // Вот эта строка в исходной функции.
                            sData += "_";
                        else
                            sData += cData[b].ToString();
                    }
                    catch
                    {
                    }
                }
                else break;
            }
            return sData;
        }       
        #endregion
    }
}


И еще один вопрос по поводу строчки перед кодом в модуле:
На С#
Код: Выделить всё
using System.Linq;
- ошибки никакой не дает.
А на VB эта строка выглядит вот так:
Код: Выделить всё
Imports System.Linq
и дает предупреждение: "Предупреждение. Пространство имен или тип, указанные в операторе Imports "System.Linq", не содержат открытые члены или не могут быть найдены. Убедитесь, что пространство имен или тип определены и содержат хотя бы один открытый член. Убедитесь, что имя импортируемого элемента не было использовано в других Imports."

Что делать чтобы все было хорошо? Помогите разобраться, пожалуйста.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение FireFenix » 26.06.2010 (Сб) 14:01

Подскажите пожалуйста правильно ли я исправил одну ошибку:
Код: Выделить всё
Public Function ReadMemoryString_(ByVal lpBaseAddress As Integer, ByVal hProcess As IntPtr) As String
            Dim cData As Char() = New Char(63) {}
            Dim lpBuffer As Byte() = New Byte(63) {}
            Dim sData As String = ""
            Dim lpNumberOfBytesRead As Integer

            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, lpNumberOfBytesRead)
            Dim c As Integer = -2
            For b As Integer = 0 To 30
                c += 2
                If lpBuffer(c) <> 0 Then
                    cData(b) = BitConverter.ToChar(lpBuffer, c)
                    Try
                        If cData(b) = 32 Then '  "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."

                            sData += "_"
                        Else
                            sData += cData(b).ToString()
                        End If
                    Catch
                    End Try
                Else
                    Exit For
                End If
            Next
            Return sData
        End Function

Если вот эту строку:
If cData(b) = 32 Then ' Выдает ошибку: "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."
Заменить на:
If cData(b) = Chr(32) Then - будет правильно?

На C# эта функция выглядела так:
Код: Выделить всё
public string ReadMemoryString_(int lpBaseAddress, IntPtr hProcess)
        {
            char[] cData = new char[64];
            byte[] lpBuffer = new byte[64];
            string sData = "";
            int lpNumberOfBytesRead;

            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, out lpNumberOfBytesRead);
            int c = -2;
            for (int b = 0; b < 31; b++)
            {
                c += 2;
                if (lpBuffer[c] != 0)
                {
                    cData[b] = BitConverter.ToChar(lpBuffer, c);
                    try
                    {
                        if (cData[b] == 32) // Вот эта строка в исходной функции.
                            sData += "_";
                        else
                            sData += cData[b].ToString();
                    }
                    catch
                    {
                    }
                }
                else break;
            }
            return sData;
        }       
        #endregion
    }
}


Dim cData As Char() = New Char(63) {} создаёт массив символов и сравнивать каждый элемент массива можно только с символом...
смею предположить, что здесь тоже должен был быть массив байтов Dim cData(64) as Byte, что будет соответствовать коду

If cData(b) = 32 Then ' Выдает ошибку: "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."
Заменить на:
If cData(b) = Chr(32) Then - будет правильно?

да

Насчёт этого sData += "_" и Data += cData(b).ToString() не знаю - работает или нет, но с синтаксической точки зрения было бы правильнее sData &= "_" и sData &= cData(b).ToString()

И еще один вопрос по поводу строчки перед кодом в модуле:
На С#
Код: Выделить всё
using System.Linq;
- ошибки никакой не дает.
А на VB эта строка выглядит вот так:
Код: Выделить всё
Imports System.Linq
и дает предупреждение: "Предупреждение. Пространство имен или тип, указанные в операторе Imports "System.Linq", не содержат открытые члены или не могут быть найдены. Убедитесь, что пространство имен или тип определены и содержат хотя бы один открытый член. Убедитесь, что имя импортируемого элемента не было использовано в других Imports."

Наверное библиотека в рефренсах не подцеплена или несколько одинаковых объявлений в одном модуле
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 27.06.2010 (Вс) 17:48

Dim cData As Char() = New Char(63) {} создаёт массив символов и сравнивать каждый элемент массива можно только с символом...
смею предположить, что здесь тоже должен был быть массив байтов Dim cData(64) as Byte, что будет соответствовать коду


Я конечно дико извиняюсь, но чем отличаются эти объявления? С точки зрения синтаксиса - это вроде одно и то же.

По остальному: + и & для выражений типа string это вроде как то же одно и то же... Ну я не давно в программировании. Переубедите меня, пожалуйста, если это не так. Я ж че.. я ж чтоб пральна все было...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение Viper » 27.06.2010 (Вс) 18:42

Вообще-то Char<>Byte. Byte он и есть байт, а вот Char равен двум байтам.
Весь мир матрица, а мы в нем потоки байтов!

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение FireFenix » 27.06.2010 (Вс) 23:58

Viper писал(а):Вообще-то Char<>Byte. Byte он и есть байт, а вот Char равен двум байтам.

ай беда, я забыл что .net всё в 2х байтном уникоде....

krukovis84 писал(а):
Dim cData As Char() = New Char(63) {} создаёт массив символов и сравнивать каждый элемент массива можно только с символом...
смею предположить, что здесь тоже должен был быть массив байтов Dim cData(64) as Byte, что будет соответствовать коду


Я конечно дико извиняюсь, но чем отличаются эти объявления? С точки зрения синтаксиса - это вроде одно и то же.

По остальному: + и & для выражений типа string это вроде как то же одно и то же... Ну я не давно в программировании. Переубедите меня, пожалуйста, если это не так. Я ж че.. я ж чтоб пральна все было...

& - конкатенация
+ - сложение
у vb.net, но на + мало ли что может быть заведено у стринга :)
Последний раз редактировалось FireFenix 28.06.2010 (Пн) 0:00, всего редактировалось 1 раз.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 28.06.2010 (Пн) 10:21

FireFenix писал(а):
Viper писал(а):Вообще-то Char<>Byte. Byte он и есть байт, а вот Char равен двум байтам.

ай беда, я забыл что .net всё в 2х байтном уникоде....


Я должен сделать вывод что правильно объявлять массив нужно все таки: Dim cData As Char() = New Char(63) {} , а не Dim cData(64) as Byte ?



FireFenix писал(а): у vb.net, но на + мало ли что может быть заведено у стринга :)


Да, согласен, мало ли что)). А конкатенация для строки всяко понятней и роднее.


FireFenix писал(а):If cData(b) = 32 Then ' Выдает ошибку: "Ошибка 10 Оператор "=" для типов "Char" и "Integer" не определен."
Заменить на:
If cData(b) = Chr(32) Then - будет правильно?

да



А почему так будет правильно, объясните пожалуйста. А то я просто по наитию поправил, но так и не понял почему нужно так .
И одна просьба, не могли бы откомментировать на сколько сможете подробно эту функцию:
Код: Выделить всё
Public Function ReadMemoryString_(ByVal lpBaseAddress As Integer, ByVal hProcess As IntPtr) As String
            Dim cData As Char() = New Char(63) {}
            Dim lpBuffer As Byte() = New Byte(63) {}
            Dim sData As String = ""
            Dim lpNumberOfBytesRead As Integer

            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, lpNumberOfBytesRead)
            Dim c As Integer = -2
            For b As Integer = 0 To 30
                c += 2
                If lpBuffer(c) <> 0 Then
                    cData(b) = BitConverter.ToChar(lpBuffer, c)
                    Try
                        If cData(b) = Char(32) Then

                            sData += "_"
                        Else
                            sData += cData(b).ToString()
                        End If
                    Catch
                    End Try
                Else
                    Exit For
                End If
            Next
            Return sData
        End Function


Я бы на ее примере со всеми остальными функциями разобрался из модуля, который с С# конвертировал. А то я уже 3 день изучаю эти функции, но к пониманию никак не могу приблизиться.
Заранее благодарен.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение FireFenix » 28.06.2010 (Пн) 11:20

krukovis84 писал(а):
FireFenix писал(а):
Viper писал(а):Вообще-то Char<>Byte. Byte он и есть байт, а вот Char равен двум байтам.

ай беда, я забыл что .net всё в 2х байтном уникоде....

Я должен сделать вывод что правильно объявлять массив нужно все таки: Dim cData As Char() = New Char(63) {} , а не Dim cData(64) as Byte ?

Вообще нада смотреть, как лежат данные в процессе.... обычно текст символ 1 байтной кодировкой, но судя из примера у тебя используется 2х байтная => нужно Dim cData As Char

FireFenix писал(а):If cData(b) = Chr(32) Then - будет правильно?
А почему так будет правильно, объясните пожалуйста. А то я просто по наитию поправил, но так и не понял почему нужно так.

В зависимости, какую кодировку рассматриваем, то используем приведение кода символа к символу через
Chr - для 1 байтных
ChrW или Char - для 2х байтных
Или если поизвращаться, то можно и через System.Text.Encoding

И одна просьба, не могли бы откомментировать на сколько сможете подробно эту функцию:
Я бы на ее примере со всеми остальными функциями разобрался из модуля, который с С# конвертировал. А то я уже 3 день изучаю эти функции, но к пониманию никак не могу приблизиться.
Заранее благодарен.

Код: Выделить всё
'Функция читает текст из процесса по заданному смещению
Public Function ReadMemoryString_(ByVal lpBaseAddress As Integer, ByVal hProcess As IntPtr) As String
            Dim cData As Char() = New Char(63) {}
            Dim lpBuffer As Byte() = New Byte(63) {}
            Dim sData As String = ""
            Dim lpNumberOfBytesRead As Integer

            'Считываем, по нашему смещению и толщине буфера, кусок памяти процесса в буфер lpBuffer
            ReadProcessMemory(hProcess, lpBaseAddress, lpBuffer, lpBuffer.Length, lpNumberOfBytesRead)
            Dim c As Integer = -2

            'Пробегаем по полученному буферу и формируем строку
            For b As Integer = 0 To 30
                c += 2
                'Проверяем на нулевой символ
                If lpBuffer(c) <> 0 Then
                    'BitConverter.ToChar - преообразуем байтовое представление в наш тип Char
                    cData(b) = BitConverter.ToChar(lpBuffer, c)
                    Try
                        '32- вроде код пробела
                        'преобразуем наш код 32 в тип Char и сравниваем с тем, что валяется в массиве
                        If cData(b) = Char(32) Then
                            'Если найдено, то пробел заменяет нижней чертой и записывает в конечную строку
                            sData += "_"
                        Else
                            'Если нет - просто записываем в конечную строку символ из буфера
                            sData += cData(b).ToString()
                        End If
                    Catch
                    End Try
                Else
                    'Если достигли конца нуль-терминированной строки, то выходим из цикла и отдаём конечную строку
                    Exit For
                End If
            Next

            Return sData
        End Function
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

krukovis84
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 108
Зарегистрирован: 04.08.2009 (Вт) 11:16
Откуда: Кочевник

Re: Подключение к проекту на VB.net модулей с расширением .CS

Сообщение krukovis84 » 29.06.2010 (Вт) 12:35

Ура! Спасибо всем! Во всем разобрался!


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

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

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

    TopList