2012-01-24 5 views
3

これを達成する最も良い方法は何でしょうか?私はC#のWindowsサービスで生成されたファイル名のリストを持っています。私は最終的にそれらをSTLセットに入れ、それをファイルマッピングにプッシュする必要があります。私は実際には、C#でこの構造を作成することは禁止されているか、あまりにも価値があるのは難しいと思っていますが、作成したセットへのポインタを返すネイティブdllを使用できますか?ここの考えは役に立ちます!C#でSTL std :: setを作成し、C++にマーシャリングする

+1

'のstd :: set'にデータを渡すことはいずれにも完全に無効になり、ポインタが含まれている可能性がありますそれを作成したプログラム以外のコンテキスト。私はC#でそれをシミュレートすることができるいくつかの奇跡のライブラリを持っていたとしても、それをファイルマッピングに書くことは可能ではないと思います。以前の質問に対する答えを早めに受け入れたと思います。 –

+1

ええ、私の読書は私を同じ結論に導いています。私はまだ最後の投稿への答えは受け入れられると思うが、それは私の直接の質問に答えるもので、非相互シナリオにも当てはまるだろうが、それは誤解を招く恐れがある。 –

+0

「最終的にそれらをSTLセットに入れて、ファイルマッピングにプッシュする必要があります」 本当に必要なのは確実ですか?ファイルマップ(または、私が理解しているように、メモリマップされたファイル)はヒープの状態を反映しませんが、std :: setのオブジェクトはメモリマップされたファイルの(共有)アドレス空間ではなくヒープ上にあります。 私は、関連する構造を構築するか、プロセスに渡すために代わりに使用する必要がある多かれ少なかれ独自のAPIがあると思います。 – bronekk

答えて

5

std::setをC#で作成することは、実際的ではありません。しかし、名前の集合をPInvoke経由でCに伝え、そこにstd::setという名前を付けることは可能です。

extern "C" { 

    void PassNames(const wchar** ppNames, int nameCount) { 
    std:set<std::string> nameSet; 
    for (int i = 0; i < nameCount; i++) { 
     nameSet.insert(ppNames[i]); 
    } 

    PassOfTheSet(nameSet); 
    } 
} 

次に、あなたがのPInvoke使ってC#からこの関数を呼び出すことができますので、ネイティブ

[DllImport("TheDllName.dll") 
public static extern void PassNames(string[] names, int nameCount); 
+0

最終的に私はいくつかの特定のニーズのために異なる方向に進む必要がありましたが、これは素晴らしい答えです。 –

関連する問題