1 、VC++ 动态链接库可以编译为 X64 和 X86
2 、VC++ 动态链接库又可以选择编译为 结构成员 8 字节 和 4 字节对齐的库文件
(其它字节 1、2、16 与系统不匹配,可以暂时不讨论)
3、32 位系统默认结构成员 4 字节对齐
4、64 位系统默认结构成员 8 字节对齐
5、VS2017 默认 8 字节对齐,无论 VB.NET、C#、VC++ 编译为 X64 还是 X86
6、VB6_32位版本编译的程序,默认为定义结构成员对齐为 4 字节
7、VB.NET、C#、VC++ 都可以自定义结构成员对齐
因此,编译程序必须严格按编程规则,这样就不会产生程序混乱,否则参数传递容易出错,8 字节 对齐参数传递给 4 字节 对齐参数,必然出错:
1、VC++动态链接库编译为 X64 库文件,结构成员应该选择 8 字节 对齐
2、VC++动态链接库编译为 X86 库文件,结构成员应该选择 4 字节 对齐
3、VB.NET 或 C# 编译为 X64 程序,必须定义结构成员对齐为 8 字节,调用对应 8 字节 对齐的 X64 库文件
4、VB.NET 或 C# 编译为 X86 程序,必须定义结构成员对齐为 4 字节,调用对应 4 字节 对齐的 X32 库文件
自编程序 调用 自编 VC++ 动态链接库, 最容易出现的程序错误就是字节对齐不相应:
1、VB.NET 默认 8 字节对齐结构体,却编译为 32 位程序,去调用 4 字节对齐的动态链接库。
2、VB.NET 默认 8 字节对齐结构体,编译为 32 位程序,动态链接库也默认 8 字节对齐结构体,编译为 32 位 DLL,相互可以正确调用,别的程序如EXCEL 32 位调用该 8 字节对齐结构体的 32 位 DLL,数据就容易无法获取正确数据。
VB.NET定义结构成员 4 字节对齐,其下就是结构成员定义:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)>
Structure XYZ
Dim X As Integer
Dim Y As Double
Dim Z As Boolean
End Structure
VB.NET定义结构成员 8 字节对齐:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)>
Structure XYZ
Dim X As Integer
Dim Y As Double
Dim Z As Boolean
End Structure
C# 定义结构成员 4 字节对齐:
[StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=4)]
internal struct XYZ
{
public int X;
public double Y;
public bool Z;
}
C# 定义结构成员 8 字节对齐:
[StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=8)]
internal struct XYZ
{
public int X;
public double Y;
public bool Z;
}