2012-02-09 11 views
2

私はReSharperでデバッグするときに別のメモリレイアウトが得られるという問題があります。文字列の配列をマーシャリングする適切な方法は何ですか?

私は、(多くても)7文字のヌル終了文字列の配列を返すアンマネージドメソッドを持っています。 ReSharperのデバッガなしでこのメソッドを実行すると、 "next"文字列の先頭は16バイト後になります。 ReSharperのデバッガ(ReSharperのユニットテストフォームで "Debug Unit Tests"オプションを選択)を実行すると、開始は64バイト後になります。

メソッドシグネチャは、以下のスニペットに似ています。文字列配列は、ソリューションhereと同様に「作成」されます。

[return: MarshalAs(UnmanagedType.I1)] 
[DllImport("myDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
private static extern bool GetStrings(IntPtr sourceFile, 
    out IntPtr ptrToStrings, 
    out uint numberOfStrings); 
+6

私が何かを見逃していましたか?私はReSharperがVisual Studioでビルドされた通常のデバッガを使用していると考えました。 ReSharperデバッガの有無はどうやって切り替えるのですか? –

+0

それは私が考えたものです。 ReSharperを使って単体テストをデバッグすることをお勧めしますか? – cadrell0

+0

あなたはテストランナーでデバッグを指していますか? – jrummell

答えて

2

文字列を取得するために、これを使用してみてください:

[return: MarshalAs(UnmanagedType.I1)] 
[DllImport("myDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
private static unsafe extern bool GetStrings(IntPtr sourceFile, 
    [Out] out byte* ptrToStrings, 
    [Out] out uint numberOfStrings); 


[SecuritySafeCritical] 
private static unsafe string[] ManagedMethod(IntPtr sourceFile) 
{ 
    uint size; 
    byte* array; 
    if (!GetStrings(sourceFile, out array, out size)) 
    { 
     throw new Exception("Unable to read strings."); 
    } 

    string[] retval = new string[size]; 
    for (int i = 0, p = 0; i < size; i++, p += 8) 
    { 
     retval[i] = Marshal.PtrToStringAnsi(new IntPtr(&array[p])); 
    } 

    return retval; 
} 
+0

アンマネージドコードが初期化するまで、配列のサイズは不明です。 IntPtrとしてマーシャリングされています。 –

+0

さて、あなたのために何かを書きましょう。 – Zenexer

+0

IntPtrとして?なぜintではない? – Zenexer

関連する問題