Я обновил некоторый код VB6, который использует строки фиксированной длины в пользовательских типах, до VB .NET с помощью UpgradeWizard, и у меня возникли проблемы с использованием метода LSet, с которым я надеялся, что кто-то может мне помочь.
Существующий код VB6 (объявления типов);
Public Type MyType
PROP1 As String * 15
PROP2 As String * 25
End Type
Public Type MyTypeBuffer
Buffer As String * 40
End Type
Пример использования;
LSet instOfMyTypeBuffer.Buffer = ...
LSet instOfMyType = instOfMyTypeBuffer
Каков подходящий способ обновить его до .NET?
Используя UpgradeWizard, я получаю следующее:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
_
Public Structure MyType
<VBFixedString(15),System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst:=15)> _
Dim PROP1 As FixedLengthString
<VBFixedString(25),System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst:=25)> _
Dim PROP2 As FixedLengthString
Public Shared Function CreateInstance() As MyType
Dim result As New MyType
result.PROP1 = New FixedLengthString(15)
result.PROP2 = New FixedLengthString(25)
Return result
End Function
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
_
Public Structure MyTypeBuffer
<VBFixedString(CLVHDR_REC_LENGTH),System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst:=40)> _
Dim Buffer As FixedLengthString
Public Shared Function CreateInstance() As MyTypeBuffer
Dim result As New MyTypeBuffer
result.Buffer = New FixedLengthString(40)
Return result
End Function
End Structure
FixedLengthString поступает из пространства имен Microsoft.VisualBasic.Compatibility.VB6.
Когда мастер обновления не работает, это когда дело доходит до LSet. Это произвело следующее;
instOfMyTypeBuffer.Buffer = LSet(...)
instOfMyType = LSet(instOfMyTypeBuffer)
Что не компилируется, выдавая эти ошибки;
Значение типа 'String' не может быть
конвертировано в
'Microsoft.VisualBasic.Compatibility.VB6.FixedLengthString'
Аргумент не указан для параметра
«Длина» публичной функции
LSet (источник как строка, длина как
Integer) As String '
Значение типа 'MyTypeBuffer' не может быть
конвертируется в 'String'
Итак, я могу использовать ToString (), чтобы пройти часть пути туда, но все еще существует проблема самого вызова метода LSet. Что я должен сделать, чтобы воссоздать оригинальную функциональность? Мастер обновления дал мне совершенно неуместное преобразование, или его можно превратить в нечто пригодное для использования?