今天在做一个关于IC卡读写的程序,用到了一个IC卡读写器,有一个配套的dll动态库和一些库函数的说明,但是调试的时候总是会遇到一些奇怪的现象。VB6的示例中可以的操作,在我的程序中就会出现“未将对象引用设置到对象的实例”等等错误。折腾了半天也没有什么进展。后来用.NET的升级向导将那个VB6的实力程序升级,发现模块中函数的声明有一些变化。
VB6 中声明:Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Long, ByVal page As Integer, ByVal offset As Integer, ByVal le As Long, ByVal data_buffer$) As Integer
升级后.NET 的声明:Declare Function srd_45d041 Lib "mwic_32.dll" (ByVal icdev As Integer, ByVal page As Short, ByVal offset As Short, ByVal le As Integer, ByVal data_buffer As String) As Short
VB6中Long类型在.NET中变成了Integer,而Integer变成了Short。就这么一点小小的问题搞得我郁闷了半天。把程序调试通过以后,我查了一下MSDN Library,发现.NET的数据类型和VB6的存在一些变化。具体的可以看下面这两张表。
表1 VB6中的数据类型
数据类型 | 存储空间大小 | 范围 |
Byte | 1 个字节 | 0 到 255 |
Boolean | 2 个字节 | True 或 False |
Integer | 2 个字节 | -32,768 到 32,767 |
Long (长整型) | 4 个字节 | -2,147,483,648 到 2,147,483,647 |
Single (单精度浮点型) | 4 个字节 | 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38 |
Double (双精度浮点型) | 8 个字节 | 负数时从 -1.79769313486232E308 到 -4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308 |
Currency (变比整型) | 8 个字节 | 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 |
Decimal | 14 个字节 | 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001 |
Date | 8 个字节 | 100 年 1 月 1 日 到 9999 年 12 月 31 日 |
Object | 4 个字节 | 任何 Object 引用 |
String (变长) | 10 字节加字符串长度 | 0 到大约 20 亿 |
String (定长) | 字符串长度 | 1 到大约 65,400 |
Variant (数字) | 16 个字节 | 任何数字值,最大可达 Double 的范围 |
Variant (字符) | 22 个字节加字符串长度 | 与变长 String 有相同的范围 |
用户自定义 (利用 Type ) | 所有元素所需数目 | 每个元素的范围与它本身的数据类型的范围相同。 |
表2 VB.NET中的数据类型
Visual Basic 类型 | 公共语言运行库类型结构 | 名义存储分配 | 取值范围 |
Boolean | System.Boolean | 2 个字节 | True 或 False |
Byte | System.Byte | 1 个字节 | 0 到 255(无符号)。 |
Char | System.Char | 2 个字节 | 0 到 65535(无符号)。 |
Date | System.DateTime | 8 个字节 | 0001 年 1 月 1 日凌晨 0:00:00 到 9999 年 12 月 31 日晚上 11:59:59。 |
Decimal | System.Decimal | 16 个字节 | 0 到 +/-79,228,162,514,264,337,593,543,950,335 之间不带小数点的数; 0 到 +/-7.9228162514264337593543950335 之间带 28 位小数的数;最小非零数为 +/-0.0000000000000000000000000001 (+/-1E-28)。 |
Double (双精度浮点型) | System.Double | 8 个字节 | 负值取值范围为 -1.79769313486231570E+308 到 -4.94065645841246544E-324;正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。 |
Integer | System.Int32 | 4 个字节 | -2,147,483,648 到 2,147,483,647。 |
Long (长整型) | System.Int64 | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。 |
Short | System.Int16 | 2 个字节 | -32,768 到 32,767。 |
Object | System.Object (类) | 4 个字节 | 任何类型都可以存储在 Object 类型的变量中。 |
Single (单精度浮点型) | System.Single | 4 个字节 | 负值取值范围为 -3.4028235E+38 到 -1.401298E-45;正值取值范围为 1.401298E-45 到 3.4028235E+38。 |
String (变长) | System.String (类) | 取决于实现平台 | 0 到大约 20 亿个 Unicode 字符。 |
用户定义的类型 (结构) | (从 System.ValueType 继承) | 取决于实现平台 | 结构中的每个成员都有由自身数据类型决定的取值范围,并与其他成员的取值范围无关。 |
从两张表中可以清楚地看到VB6中的Integer类型是2个字节长度的,Long是4个字节长度的。在.NET中Interger变成了4个字节,Long是8个字节。多了一个Short类型,是2个字节的。
数据类型的字长不一样导致了调用库函数时数据类型转化的冲突,所以也就出现了很多奇怪的问题,不过现在问题顺利解决,希望这些经验能对.NET的初学者有一些帮助。