2012-01-24 39 views
3

實現此目的的最佳方法是什麼?我有一個在C#windows服務中生成的文件名列表。我需要最終讓他們進入STL集合,並將其推送到一個文件映射。我假設實際上在C#中創建這個結構要麼是禁止的,要麼是太難以勝任,但是我可以使用本機dll,它返回一個指向它創建的集合的指針,然後我將它傳遞給filemapping?這裏的任何想法都會有所幫助!在C#中創建一個STL std :: set,並將其命名爲C++

+1

一個'的std :: set'可能包含指向這將是任何完全無效上下文不是創建它的程序。我不認爲將它寫入文件映射是可能的,即使你有一些可以在C#中模擬它的奇蹟庫。我想你過早地接受了你之前提出的問題的答案。 –

+1

是的,我的閱讀讓我得出了同樣的結論。我仍然認爲最後一篇文章的答案是可以接受的,因爲它回答了我的直接問題,並且適用於非互操作場景,但這很可能會引起誤解。 –

+0

「我需要最終讓他們進入STL集,並將其推送到文件圖」 您是否確定這是您所需要的?文件映射(或者,據我所知,內存映射文件)並不反映堆的狀態,但std :: set中的對象將在堆上,而不在內存映射文件的(共享)地址空間中。 我想應該使用一些或多或少的專有API來代替構建相關結構或將其傳遞給流程。 – bronekk

回答

5

在C#中創建一個std::set並不實際。然而,可以通過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

由於某些特殊需要,我最終需要走另一個方向,但這是一個很好的答案。 –

相關問題