Как переписать "LSet" из VB6 в VB.net (с типами структур)? - PullRequest
3 голосов
/ 30 декабря 2011

У меня есть приложение VB6, которое использует LSet() с двумя пользовательскими типами данных (Тип) для назначения данных из одного типа в другой, например:

Lset type1 = Type2

Теперь я должен применить эквивалентную логикув VB.net.Однако в VB.net LSet нельзя использовать для различных типов (типы в VB6).

Как реализовать логику VB6 LSet вVB.net?

Пример / типовой код:

Public MQ_Policy As typPolicyDataRetrieval 
Public typPolicyDataBlock As gtypPolicyDataBlock 

With MQ_Policy.Input 
   .PcPolicyIDNum = Mid(InputString, 1, 8) 
   .PcPolicyIDNumPrefix = " " 
   .Datalength = Format$(CLng(Len(MQ_Policy)) - (Len(MQ_Policy.MQHeader) + Len(MQ_Policy.Input.Datalength)), String$(Len(.Datalength), "0")) 
End With 

LSet typPolicyDataBlock = MQ_Policy

Благодарим Вас за помощь.

Ответы [ 2 ]

1 голос
/ 30 декабря 2011

Вы не должны делать это в VB.NET.
Есть и другие способы, такие как определение операторов преобразования из одного типа в другой и последующее их использование в коде:

Private Structure t1
    Public a As Short
    Public b As Short
End Structure

Private Structure t2
    Public v As Integer

    Public Shared Widening Operator CType(ByVal v As t1) As t2
        Return New t2 With {.v = v.a Or (CType(v.b, Integer) << 16)}
    End Operator
End Structure

Sub Main()
    Dim v1 As t1, v2 As t2

    v2 = v1 ' Works!
End Sub

Однако, если вы чертовски уверены, что вам нужно выполнить побайтовое копирование, и вы знаете о проблемах выравнивания и довольны ими, то вы можете сделать это:

Imports System.Runtime.InteropServices

Public Function CopyStructure(ByVal s As Object, ByVal ResultType As System.Type) As Object
    Dim h As GCHandle

    Try
        h = GCHandle.Alloc(s, GCHandleType.Pinned)

        Return Marshal.PtrToStructure(h.AddrOfPinnedObject, ResultType)
    Finally
        If h.IsAllocated Then h.Free()
    End Try
End Function

Sub Main()
    Dim v1 As t1, v2 As t2

    v2 = DirectCast(CopyStructure(v1, GetType(t2)), t2)
End Sub
1 голос
/ 30 декабря 2011

См. Лучший ответ здесь: Преобразование пользовательского типа VB6 (со строками фиксированной длины) в VB .NET

Короче говоря, LSet, когда используется с типами, копирует память из одного места вдругой!Так что это НЕ должно использоваться ни при каких обстоятельствах.Исходный код не очень хорош, поэтому его преобразование «как есть» будет плохой идеей.

При этом вы должны иметь возможность заменить его на Cast, если объекты совместимы, или написать функцию преобразователя для изменения.введите вручную.

...