【发布时间】:2018-09-29 02:11:49
【问题描述】:
我正在尝试调用一个 DLL 函数(用 C 编写),该函数需要一个指向外部结构的指针,而外部结构又包含一个内部结构数组。 C 结构如下所示:
typedef struct Inner {
int x;
int y;
} Inner;
typedef struct Outer {
Inner ArrayOfInners[20];
unsigned char b;
} Outer;
我将 VB.NET 结构定义如下:
<StructLayout(LayoutKind.Sequential)> _
Public Structure Inner
Public x As Integer
Public y As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Public Structure Outer
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=20)> Public ArrayOfInners() As Inner
Public b As Byte
End Structure
但是,当我实例化一个 Outer 并尝试像这样访问嵌套的 Inner 数组时......
Dim s As Outer
s.ArrayOfInners(2).x = 5
... VS 编辑器抱怨 变量 'ArrayOfInners' 在被赋值之前就被使用了。运行时可能会导致空引用异常。 事实上,在运行时我看到s.ArrayOfInners 的值是Nothing——与我预期的相反:内部结构的嵌套数组。
这里有什么问题,如何实例化与 DLL 兼容的外部结构?
【问题讨论】:
-
Dim s As Outer根本不创建(实例化)任何东西。它只是声明s的类型为Outer。New关键字/运算符创建一个 new 对象/结构。 -
也许你只是初始化它?
s.ArrayOfInners = New Inner(20) {} -
我尝试
Dim s As New Outer得到相同的结果(顺便说一句,Outer 的所有其他成员 都正确分配,没有“New”)。我认为ArrayOfInners会像 Outer 的其他成员一样自动分配,因为我声明了<StructLayout(LayoutKind.Sequential)>。 -
所有字段都被初始化为其默认值,因为这就是 structs 的工作方式。与
StructLayout属性无关。引用类型的默认值为Nothing。 -
没有像
Inners 数组这样的东西,它是 VB.NET 中Outer结构的连续部分;数组始终是引用类型。这就是编组步骤的用途——它根据调用时的属性将 .NET 值转换为预期的形式。
标签: vb.net dll struct unmanaged typed-arrays