今天在做一個關于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的初學者有一些幫助。