.Net framework 讀取結構作法 (VBNET)

在 .Net framework 2.0 以前,在 Managed Code 中居然沒有直接讀取結構的方法?
我原先以為是 .Net framework 文件太多,我沒看到相關記載,在 VB 命名空間下,是有個 FileGet 勉強可以用,另外可以用 Unmanaged Code 讀取,但是 Unmanaged 讀的有點問題,例如下面這個結構:
Structure sTest
   GPSTime As Double
   Week As Short
   x As Double
End Structure
 
直接用 Unmanaged Code 去讀時,例如呼叫 Windows API 的 CopyMemory 或是 Marshal.Copy ,會把原先看起來是 18 Bytes 的結構耗用 24 Bytes 去讀,而問題就在於 Week 這個屬性,2 個 Bytes 會當成 8 Bytes 去讀。
 
所以這個問題我把它發到台灣微軟技術支援處去詢問 (CSS) ,問題代號 SRT060620775183 。
 
最後確認, .Net framework 內的確沒有直接讀結構的方法,必須一個個屬性去讀,若要直接處理整個結構,必須透過 Unmanaged Code 來讀,而上面 Week 當成 8 Bytes 的問題是 .Net framework 在封裝遞送結構變數時,並非是依據結構屬性變數順序排列,且不會緊密排序,預設每 8 Bytes 做一個 pack ,所以直接呼叫 Unmanaged 會出問題。
 
故上面的結構應改寫為:
<System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack:=1, CharSet:=System.Runtime.InteropServices.CharSet.Ansi)> _
Structure sTest
   GPSTime As Double
   Week As Short
   x As Double
End Structure
 
這樣在 Unmanaged Code 使用上就會恢復正常,並保證依序讀取。
有空我會整理從 Stream / Byte Array 內載入結構的函式庫放到 .Net 原始碼分享網頁。
廣告
Categories: 更新與回報 | 3 則迴響

文章分頁導航

3 thoughts on “.Net framework 讀取結構作法 (VBNET)

  1. 子璉

    今天收到通知,供大家參考:
     
    寄件者: Colin Lin
    寄件日期: 2006年7月5日 下午 04:43主旨: RE: 微軟回覆您的問題 ( 結案通知 – VB.NET-Structure結構位元組計算錯誤 )

    關於這個問題, 目前我已經為您與國外相關的部門反應, 並詢求一個public的document (我們期待是以KB的型式).
    由於處理的過程需要一段時間, 我們會在相關部門有任何回應時, 也讓您知道的.
     
    Best regards,
    Colin Lin
    Developer Team
    Microsoft GTSC-TW

    按讚數

  2. 子璉

    今天收到上 KB 的通知了:
    寄件者: Colin Lin寄件日期: Wednesday, November 22, 2006 5:21 PM主旨: RE: 微軟回覆您的問題 ( 結案通知 – VB.NET-Structure結構位元組計算錯誤 )

    您好,
     
    關於您先前針對這個問題, 希望能夠提供一篇public的KB. 目前這篇KB已經完成, 並且提供在線上查詢.
    您可以在下列的連接中找到這篇文件.
     
    How to control the physical layout of the data fields in the .NET Framework 2.0
    http://support.microsoft.com/?id=922785
     
    Best regards,
    Colin Lin
    Developer Team
    Microsoft GTSC-TW

    按讚數

  3. 子璉

    這篇雖然是 C# 的,不過寫的很讚~http://www.vsj.co.uk/articles/display.asp?id=501

    按讚數

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: