Преобразование модуля VB6 в VB.NET

Я почти закончил преобразование модуля из VB6 в VB.NET, но у меня проблемы со следующими двумя цитатами, и мне интересно, есть ли способ сделать это:

Structure AUDINPUTARRAY
    bytes(5000) As Byte
End Structure

Я пытаюсь изменить эту строку байтов на: Dim bytes (5000) as Byte, но это не позволяет мне определять размер в структуре.


Вот второй:

Private i As Integer, j As Integer, msg As String * 200, hWaveIn As integer

Я понятия не имею, как преобразовать: msg As String * 200


person user1060582    schedule 02.12.2011    source источник


Ответы (3)


вы не можете объявить начальный размер в VB.Net, вы можете установить его размер позже, используя оператор Redim в конструкторе или где угодно

Structure AUDINPUTARRAY
    Public bytes() As Byte
    Public Sub New(ByVal size As Integer)
        ReDim bytes(size) ' set size=5000

    End Sub


End Structure

В Visual Basic .NET нельзя объявить строку фиксированной длины, если в объявлении не используется атрибут класса VBFixedStringAttribute. Код в предыдущем примере вызывает ошибку.

Вы объявляете строку без длины. Когда ваш код присваивает значение строке, длина значения определяет длину строки. См. http://msdn.microsoft.com/en-us/library/f47b0zy4%28v=vs.71%29.aspx. так что ваше заявление станет

    Private i As Integer, j As Integer, hWaveIn As Integer
    <VBFixedString(200)> Private msg As String
person Akshita    schedule 02.12.2011
comment
Вау, спасибо, я не знал о ReDim или VBFixedStringAttribute. - person user1060582; 02.12.2011
comment
Public Sub AUDINPUTARRAY() не является конструктором. Конструктор Public Sub New(), но у вас не может быть конструктора без параметров для структур. - person GSerg; 02.12.2011
comment
извините, это была ошибка, я смешал синтаксис C #, прошу прощения. - person Akshita; 02.12.2011

Вы можете сделать это с помощью атрибутов

Public Structure <StructLayout(LayoutKind.Sequential)> AUDINPUTARRAY
   Public <MarshalAs(UnmanagedType.ByValArray, SizeConst := 5000)> 
     Bytes() As Byte
End Structure
person jmoreno    schedule 28.12.2011

Я бы посоветовал вам при рефакторинге вашего кода с VB6 на .net еще раз взглянуть на то, хотите ли вы вообще имитировать msg As String * 200 фиксированной длины. Если бы вы рассчитывали на строку фиксированной длины, чтобы можно было отрезать символы с конца и при этом иметь запись из 200 символов, это беспорядочный код, который зависит от побочных эффектов функции.

Когда мы преобразовали VB6 (процесс все еще продолжается), это сделало намерение кода более ясным, если мы явно установили строку в 200-байтовый блок пробелов. Возможно, заявив:

String msg = String(' ', 200)

(если это действительно в VB.net, а также в C #).

person RobertB    schedule 10.10.2013