gpt4 book ai didi

VB.net 将结构传递给非托管 dll

转载 作者:行者123 更新时间:2023-12-02 04:11:17 24 4
gpt4 key购买 nike

我正在将一些 VB6 代码迁移到 VB.net,
该代码包含一个结构,该结构包含一维数组、二维数组和一些其他变量。

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)

Elsewhere在这个站点上,我意识到我们必须“编码”结构以使其与即将接受它的非托管代码兼容。

但是在运行代码时我仍然收到运行时错误,我不知道如何使用 System.Runtime.InteropServices.Marshal类(class)。

将此结构传递给dll的正确方法是什么?

编辑:

原始的 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

最佳答案

你有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 像货币一样编码它。也许添加 attribute像这样...

  • 示例代码:
     Imports System.Runtime  
    Public Structure Test
    ''blah blah

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

    ''blah blah

    关于VB.net 将结构传递给非托管 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5072831/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com