2017-12-02 8 views
0

Marshal.SizeOf()は、MyClass型のオブジェクトの長さを計算しようとすると例外をスローします。ここでMarshal.SizeOf()は、文字列を含むオブジェクトのサイズを計算できません。

クラスです:

<StructLayout(LayoutKind.Sequential, Pack:=1)> 
Public Class MyClass 

    Public ReadOnly UniqueId As Long 

    <MarshalAs(UnmanagedType.AnsiBStr, SizeConst:=60, SizeParamIndex:=0)> 
    Public ReadOnly Name As String 

End Class 

このコードは失敗します。

Dim MyObject = New MyClass() 
Dim size = Marshal.SizeOf(MyObject) 'will throw exception here. Why? 

それは例外

どのようにすることができ、「何の意味の大きさやオフセットを計算することはできない」スローされます代わりにMyObjectの長さを取得しますか?

+0

何プラットフォームあなたは使用しています – Adrian

+0

問題は 'AnsiBStr'であるようです。 'BStr' /' LPStr'/'LPWStr'はうまくいくようですhttps://stackoverflow.com/questions/64714​​21/marshal-c-char-in-c-sharp – Slai

+0

私はx64版のAnyCPUにコンパイルしています。 –

答えて

0

私はUnmanagedType.AnsiBStrがメソッドシグネチャのパラメータ(渡された値)でのみ使用できると信じています。

BSTRへの参照は、長さのプレフィックス付き文字配列へのポインタです。したがって、プロセスのビット数(x32またはx64)に応じて、4または8バイトのサイズの.Net Intptrになります。あなたはANSI文字が必要な場合は、StructLayout宣言の一部としてあることを定義し、UnmanagedType.BStr

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Ansi)> 
Public Class [MyClass] 
    Public ReadOnly UniqueId As Long 
    <MarshalAs(UnmanagedType.BStr)> 
    Public ReadOnly Name As String 
End Class 

推奨読書などの文字列をタグ付け:

-1

私は手伝っています。マーシャルはに使用されます。値のタイプ例:構造クラスです。参照型は、内部で未使用のオブジェクトを計算する必要はありません。 U:構造体を使用して作品を作成する必要があります。私はコードの例を挙げていますが、残念ながら私はC#で書いています。

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestingData p = new TestingData(); 
     Console.WriteLine("Number of bytes : {0}", Marshal.SizeOf(p)); 
    } 
} 

public struct TestingData 
{ 
    public string a; 
} 

希望すると助かります。あなたはここに行くことができますMarshal Documentation

関連する問題