狀況

當動態目標 Microsoft.NET Framework 4.5.1 或 Microsoft.NET Framework 4.5.2 和程式碼的程式碼繫結至方法 (例如,使用 Windows PowerShell、 IronPython、 IronRuby 或另一種動態語言的指令碼) 呼叫System.Runtime.InteropServices.Marshal.SizeOf方法或System.Runtime.InteropServices.Marshal.PtrToStructure方法時,您可能會遇到下列問題。

注意已編譯成受管理的可執行檔的程式碼並不會呈現這些問題,除非該程式碼在 C# 中使用動態的關鍵字。

問題 1

呼叫System.Runtime.InteropServices.Marshal.SizeOf擲回下列的MethodInvocationException例外狀況︰

型別 ' <型別名稱>' 無法封送處理為 unmanaged 的結構;可以計算任何有意義的大小或位移。

問題 2

呼叫System.Runtime.InteropServices.Marshal.PtrToStructure擲回下列的MethodInvocationException例外狀況︰

指定的結構必須 blittable 或有配置資訊。


問題 3

呼叫System.Runtime.InteropServices.Marshal.PtrToStructure擲回下列的RuntimeBinderException例外狀況︰

不能隱含轉換 'void' 到 'object' 型別。


原因

之所以發生這個問題,是因為指令碼引擎和動態語言可能會將繫結至.NET Framework 中引入新多載。特別是,先前使用Marshal.SizeOf(Type)的呼叫可能現在呼叫Marshal.SizeOf < T > (T),而且使用Marshal.PtrToStructure (IntPtr,型別)的呼叫可能現在呼叫Marshal.PtrToStructure < T >(IntPtr, T)。這項變更將導致方法或執行階段繫結器擲回例外狀況。

因應措施

若要解決這個問題,請變更程式碼,使其使用正確的多載,如果您的語言,可讓您執行這項操作。如果您無法指定特定的方法多載,變更程式碼,使它改用新的方法多載正確。

C# 動態引動過程

在呼叫方法SizeOf或方法PtrToStructure內新增設計成用 System.Type轉型。例如︰

object obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, (System.Type)type);int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);


注意這需要時才是動態的其中一個方法的引數。

Windows PowerShell 指令碼

在呼叫方法SizeOf或方法PtrToStructure內新增設計成用 System.Type轉型。例如︰

$size = [System.Runtime.InteropServices.Marshal]::SizeOf([System.Type] $type)
$obj = [System.Runtime.InteropServices.Marshal]::PtrToStructure($ptr, [System.Type] $type)

IronPython 指令碼

建立型別的新型別執行個體,然後使用新的方法多載。例如︰

typeInstance = type()
size = System.Runtime.InteropServices.Marshal.SizeOf(typeInstance)

obj = System.Runtime.InteropServices.Marshal.PtrToStructure(ptr, typeInstance)

狀態

Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。

參考

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

您對翻譯品質的滿意度為何?

會影響您使用體驗的因素為何?

是否還有其他的意見反應? (選填)

感謝您的意見反應!

×