2012-02-15 14 views
2

fixed()ステートメントを使用して固定する必要があるのはいつですか? GetWindowText()呼び出し中にStringBuilderオブジェクトを移動するガベージコレクタを防ぐ何C#ガベージコレクタがオブジェクトを移動させないようにするには、いつピニングが必要ですか?

public class Win32API { 
[DllImport("User32.Dll")] 
public static extern void GetWindowText(int h, StringBuilder s, 
int nMaxCount); 
} 
public class Window { 
    internal int h;  // Internal handle to Window. 
    public String GetText() { 
     StringBuilder sb = new StringBuilder(256); 
     Win32API.GetWindowText(h, sb, sb.Capacity + 1); 
    return sb.ToString(); 
    } 
} 

、そしてなぜ彼らは、固定()文でSBを固定されていません。私はMicrosoftからこのなど、多くの例を参照してください?

+1

固定ステートメントは実際にオブジェクトを固定しないため、1つです。 pinvoke marshallerが本当にピン留めするのは、必要なときだけです。ここでは、文字セットは間違っています。 –

答えて

7

プラットフォーム呼び出しを使用する場合のマーシャリングシステムでは、オブジェクトが移動されるのを防ぐことができますが、メソッド呼び出しの間のみ移動できます。

ネイティブ側がオブジェクトへの参照を保存し、後でそのオブジェクトで「何か」を実行しようとすると、ピンニングが必要です。 P/Invokeを使用するネイティブメソッドへの単一の呼び出しには必須ではありません。

関連する問題