[VB2008] 結構或類別中 LayoutKind.Sequential 跟泛型不能同時使用

這個問題我是 11/15 發給 CSS 的,這個問題對我很重要,我很多程式是這樣設計的,不過回應有點無言,我常常說 VB Product Team 常常腦袋跟使用者不同,這也是其中一例吧。
 
提問中,我以 Variant 資料型態為例,說明結構中多型的需求,事實上很多二進位檔都是這樣設計的,比如說不同色彩深度的圖檔、GIS 的資料等,所以在結構中用泛型是很省事的一種邏輯設計,沒想到居然在 VB 中被擋下,C# 仍允許結構中用泛型,這又是另一樁開發工具上的歧視,甚至,VB Product Team 提不出解決方案,只好拜託 CSS 這邊持續幫我凹到死,可以看 CSS 最後回覆的意思就知道,礙於結案壓力先關閉,然後看看 VB Product Team 到底打算怎樣解決。
 
我原先的很多存取二進位檔的專案變成都不能升級。我滿想罵句髒話的。
 
CSS 回應中的網址,中文版在這:http://msdn.microsoft.com/zh-tw/library/aa983372(VS.80).aspx

標題:

VB 2008 不相容 VB 2005 程式碼

 

造成問題:

無法執行,程式邏輯必須改寫

 

重現步驟(產生之測試檔如附件):

1.      VB2005開啟新的 Windows專案,並貼上下方測試程式碼。 (可直接開啟附加檔內專案)

 

Public Class Form1

<System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack:=1, CharSet:=System.Runtime.InteropServices.CharSet.Ansi)> _

     Structure typeVariant(Of myVariant)

          Dim VarType As Short

          Dim Value As myVariant

          Public Sub New(ByVal vValue As myVariant)

               With Me

                    .VarType = Microsoft.VisualBasic.VarType(vValue)

                    .Value = vValue

               End With

          End Sub

          Public Overloads Function ToString()

               Return String.Format("{0}({1},{2}): {3}", Me.Value, Me.VarType, TypeName(Me.Value), System.Runtime.InteropServices.Marshal.SizeOf(Me))

          End Function

     End Structure

 

     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

          Debug.Print(New typeVariant(Of Integer)(1).ToString)

          Debug.Print(New typeVariant(Of Double)(1).ToString)

          Debug.Print(New typeVariant(Of Decimal)(1).ToString)

     End Sub

End Class

 

2.      測試執行得到下圖結果

 

3.      相同專案改以 VB2008 開啟,並自動升級,在原始碼即發生下圖錯誤:

 

4.      將結構屬性宣告移除後,雖可執行,但是將得到非預期的結果。

 

移除此行:

<System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack:=1, CharSet:=System.Runtime.InteropServices.CharSet.Ansi)> _

 

得到結果請與 VB2005 結果比較,非預期結果發生在冒號右邊:

 

由上可知,屬性宣告不能移除,但不移除不能使用泛型宣告,此屬性宣告之必要性可參閱 Microsoft KnowledageBase :

http://support.microsoft.com/?id=922785

 

 

補充:

此問題採 VB6 存入 Variant 變數之結構為例,但實際上並非僅用在 Variant 變數上,例如多數 GIS 軟體的資料檔常採用類似的結構來儲存 點, , 多重折線, 多邊形等,原先在結構內使用泛型宣告可輕鬆存取檔案內的多種資料型態,故仍需在使用結構屬性宣告下,仍能使用泛型。

 

連絡資訊:

姓名:鄭子璉

電話:xxxxxxxx / xxxxxxxx

技術支援服務合約編號:?????????

E-Mail xxxxx@xxxx.xxx.xxxxxxxx@xxxxxx.xxxx.xxx

 

背景:

以下軟體皆為繁體中文版 (MSDN  VST )

OS: Windows  2003  R2 SP2 + Microsoft Update (2008/11/11)

VSTS 2005: 8.0.50727.762  (SP.050727-7600) + .Net 2.0.50727 SP2 + Microsoft Update (2008/11/11)

VSTS 2008: 9.0.30729.1 SP + .Net 3.5 SP1 + Microsoft Update (2008/11/11)


這個問題滿複雜的,中間多次跟 CSS 討論,無論如何,VB Product Team 滿堅持的,只好放棄擺爛。中間討論沒啥好貼的,下面直接轉結案的總回信:


From: xxxxxxxxxx [mailto:xxxxxxxxx@microsoft.com]
Sent: Friday, December 12, 2008 11:50 AM
Subject: Case SRT081117831134 – Prof/VB2008/Attribute ‘StructLayout’ cannot be applied to a generic type

 

鄭先生您好:
謝謝您的來電。敝姓x,我是台灣微軟技術支援工程師,很榮幸有機會為您服務。

 

關於這個 case 和您在電話中確認過,您並同意此 case 結案,請參考下列此 case 的處理報告。

 

問題代號︰SRT081117831134

 

問題描述︰Prof/VB2008/Attribute ‘StructLayout’ cannot be applied to a generic type

 

解決方法︰

 

解決方法

根據 Visual Studio Product Team 的回覆,這是一個設計方面的考量,並不屬於一個已知的問題。

 

會有這樣的設計考量是因為此種使用方式在 Runtime 可能會造成 TypeLoadException,因此 Visual Studio Product Team 決定在 Compiler 時期就將此使用方式檔下來,所以才會有Attribute ‘StructLayout’ cannot be applied to a generic type 的編譯錯誤訊息。

 

請參考 MSDN 有關此問題的文章:

http://msdn.microsoft.com/en-us/library/aa983372(VS.80).aspx

 

至於在 VS2005 Sp1 可以編譯過的狀況,對 Product Team 而言這才是已知的問題,意思是原本他們打算在 VS2005 Sp1 Compiler 時期就將此使用方式檔下來,但因為某些原因使得當初他們並沒有修改這個問題。也因此上述的 MSDN 文件在當時才會註明 [This topic is new for Visual Studio 2005 SP1],但其實他們並沒有修改 VS2005 Compiler,而對 Product Team 而言,由於這個問題的市場衝擊有限,因此日後也不一定會修改 VS2005 Compiler

 

此外,我們亦發現 VS2008 C# Compiler 並不會把此使用方式檔下來,這也使得 VS2008 VB.Net C# 編譯行為不一致的情況。關於這部分,Product Team 的解釋是 VB.Net C# 的行為模式原本就是不同的,並不能因此一概而論,這部份我們將持續與 Product Team 進行溝通。

 

Microsoft CSS 的角度,我們也認為產品有這種問題確實會造成客戶的困擾,因此將會持續為您向 Product Team 反應下列事項:

1.    如果確定 VS2005 Compiler 不會針對這問題進行修正,則將建議修改 MSDN 文件,將 [This topic is new for Visual Studio 2005 SP1] 改為 VS2008

2.    建議 Product Team VS2008 VB.Net C# compiler 行為一致化,以避免使用者在撰寫程式時發生困擾。

3.    建議能在網站上出一篇 KB,或是 MSDN 文件,使得具有同時使用結構泛型和 StructLayout 需求的使用者,能有一套遵循的設計方式。

 

問題狀況  結案

————————————————

xxxxxxxxxx  XXX

技術支援工程師 Support Engineer
Developer Support Team
Global Technical Support Center – Taiwan
技術支援服務首頁: http://support.microsoft.com

技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

 

Delighting our customers is our #1 priority. We welcome your comments and suggestions about how we can improve the service provided to you. Please feel free to email our management team at gtscfb@microsoft.com or contact my manager directly at cych@microsoft.com.

廣告
Categories: 更新與回報 | 發表留言

文章分頁導航

發表迴響

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

WordPress.com Logo

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

Twitter picture

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

Facebook照片

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

Google+ photo

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

連結到 %s

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

%d 位部落客按了讚: