VB.net Передача структуры неуправляемой DLL - PullRequest
3 голосов
/ 22 февраля 2011

Я перенесу некоторый код VB6 на VB.net, код содержит структуру, которая содержит 1d-массивы, 2d-массивы и несколько других переменных.

Общая схема структуры Vb.net такая же, как в

Public Structure Test

    Dim a As Single
    Dim b As Single
    Dim c As Single
    <VBFixedArray(2)> Dim arr1() As Single
    <VBFixedArray(2, 2)> Dim mdarr1(,) As Single
    <VBFixedArray(4)> Dim arr2() As Byte
    <VBFixedArray(4)> Dim arr3() As Short
    <VBFixedArray(3, 2)> Dim mdarr2(,) As Integer

    Dim d As Integer
    Dim e As Decimal

End Structure

Звонок в dll объявлен как под

Public Declare Sub getState Lib "val.dll" (ByRef state As Test)

В другом месте на этом сайте я понял, что мы должны "упорядочить" структуру, чтобы она была совместима с неуправляемым кодом, который собирается его принять.

Несмотря на то, что я по-прежнему получаю ошибки во время выполнения кода, я понятия не имею, как использовать класс System.Runtime.InteropServices.Marshal.

Как правильно передать эту структуру в dll?

EDIT:

Исходный тип данных VB6 -

Public Type Test

    a As Single
    b As Single
    c As Single
    arr1(0 To 2) As Single
    mdarr1(0 To 2, 0 To 2) As Single
    arr2(0 To 4) As Byte
    arr3(0 To 4) As Integer
    mdarr2(0 To 3, 0 To 2) As Long

    d As Long
    e As Currency

End Type

1 Ответ

1 голос
/ 22 февраля 2011

У вас есть исходный код для getState в val.dll? Если он написан на C или C ++, и у вас есть исходный код или даже только заголовки, вы можете использовать P / Invoke Assistant для автоматической генерации вашего кода VB.Net.

В качестве альтернативы ... (и, пожалуйста, опубликуйте оригинальную структуру VB6!)

  • Возможно, вам придется выделить массивы перед вызовом getState, например, state.arr1 = {0.0, 0.0} и т. Д.
  • Переменная Decimal e может вызвать проблемы. В VB6 это, вероятно, переменная Currency, и, насколько я помню, Decimal не является точным эквивалентом. Будет способ сказать VB.Net маршалировать его как валюту. Возможно добавление атрибута , как это ...

Пример кода:

 Imports System.Runtime  
 Public Structure Test  
   ''blah blah

   <InteropServices.MarshalAs(InteropServices.UnmanagedType.Currency)> _  
   Dim e As Decimal  

   ''blah blah
...