#c# #vb6 #types #struct
#c# #vb6 #типы #структура
Вопрос:
Я пытаюсь перенести довольно большой исходный код с VB6 на C #. Это непростая задача, особенно для меня, довольно новичка в C#.net . В этом исходном коде используются многочисленные API для Windows, а также многочисленные типы. Я знаю, что в C # нет эквивалента типу VB6, но я уверен, что есть способ достичь того же результата. Я опубликую некоторый код ниже, чтобы дополнительно объяснить мой запрос.
VB6:
Private Type ICONDIRENTRY
bWidth As Byte
bHeight As Byte
bColorCount As Byte
bReserved As Byte
wPlanes As Integer
wBitCount As Integer
dwBytesInRes As Long
dwImageOffset As Long
End Type
Dim tICONDIRENTRY() As ICONDIRENTRY
ReDim tICONDIRENTRY(tICONDIR.idCount - 1)
For i = 0 To tICONDIR.idCount - 1
Call ReadFile(lFile, tICONDIRENTRY(i), Len(tICONDIRENTRY(i)), lRet, ByVal 0amp;)
Next i
Я пробовал использовать структуры и классы — но пока безуспешно.
Я хотел бы увидеть преобразование структуры этого типа, но если бы у кого-то была хоть какая-то подсказка о том, как преобразовать все это целиком, это было бы невероятно полезно. Я уже потратил бесчисленное количество часов на этот небольшой проект.
Если это имеет какое-то значение, то это исключительно в образовательных целях.
Заранее благодарю тебя за любую помощь, Эван
Комментарии:
1. Когда вы говорите «не повезло», что вы имеете в виду.
2. в VB6, когда я набираю «Dim tICONDIRENTRY() как ICONDIRENTRY», я могу затем ввести «tICONDIRENTRY». и появится список его переменных. Но когда я делаю это на C #, ничего не появляется, как будто это даже не нравится структуре.
3. Что с вашим кодом… :S почему все это в верхнем регистре? В C # вы бы создали это как класс и создали его экземпляр. MyClass MyClass = новый MyClass(); MyClass. MyProperty = «материал»;
4. хотя вы предпочитаете переносить VB6 на C #, но, поскольку у вас большая база кода, я бы рекомендовал порт для VB.NET . Я говорю вам это в соответствии с нашим собственным простым опытом. для сравнения с переписыванием на C # потребовались минимальные усилия. конечно, нам приходилось придерживаться старых технологий, например ado, для сравнения с ado.net из-за нехватки времени и, да, очень большой базы кода 🙂 просто откройте vbp в VS.net и следуйте инструкциям по миграции и исправьте проблемы, которые не были выполнены автоматически.
Ответ №1:
struct
является эквивалентом. Вы бы выразили это так:
struct IconDirEntry {
public byte Width;
public byte Height;
public byte ColorCount;
public byte Reserved;
public int Planes;
public int BitCount;
public long BytesInRes;
public long ImageOffset;
}
Вы объявляете переменную, подобную этой:
IconDirEntry entry;
Как правило, в C # префиксы типа не используются, равно как и все заглавные буквы, за исключением, возможно, констант. struct
s — это типы значений в C #, так что это означает, что они всегда передаются по значению. Похоже, что вы передаете их в метод, который их заполняет. Если вы хотите такое использование, вам придется использовать классы.
Комментарии:
1. Целое число в VB6 является коротким в C #, а длинное в VB6 является целым в C #. Ваша структура не совсем корректна.
2. Большое вам спасибо. Я действительно новичок. Извините
Ответ №2:
Я не совсем уверен, в чем ваша проблема, но это небольшой пример того, как использовать структуру.
struct aStrt
{
public int A;
public int B;
}
static void Main(string[] args)
{
aStrt saStrt;
saStrt.A = 5;
}
Комментарии:
1. Я не делал элементы внутри структуры общедоступными. Немного смущает… Спасибо
Ответ №3:
Ваш вопрос неясен..
С какими проблемами вы сталкиваетесь, когда используете struct или class и определяете эти элементы поля? Вы не можете получить доступ к этим элементам, используя экземпляр, созданный для этого класса??
В противном случае, объявите класс как статический и сделайте все элементы внутри класса также статическими, чтобы вы могли получить к ним доступ без создания какого-либо экземпляра!!
Ответ №4:
Может быть, вы пытаетесь получить что-то подобное?
struct IconDirEntry
{
public byte Width;
// etc...
}
IconDirEntry[] tICONDIRENTRY = new IconDireEntry[tICONDIR.idCount - 1];