none
C# 程式透過Shared Memory 與C++程式溝通 RRS feed

  • 問題

  • 各位前輩 目前遇到關於Shared Memory的疑問想請教一下

    我先說明一下我的環境跟用途

    在同一台電腦上有兩隻程式,一個是由C#開發,一個由C++開發

    兩個程式要透過 Shared Memory 的方式進行溝通

    但什麼是 Shared Memory ,兩隻程式之間怎麼溝通起來我完全沒有概念....

    我自己Google了一下.Net Framework 跟一些相關的文章

    看到了幾個方式,但是因為我完全沒接觸過,也不知道我找的範例程式到底是不是我所需要的功能

    目前看到很多都是寫 使用 Memory Mapped Files 

    但我看到的一些範例都會出現指定一個檔案的路徑

    我不確定這是其中一種方式,還是所謂Shared Memory就是這樣去使用

    因為我自己感覺所謂 Shared Memory 應該是兩隻程式對同一個記憶體位置去做資料讀寫的動作

    而不是共同去讀什麼檔案吧。


    我甚至不確定C#到底能不能像C++有這樣去讀取記憶體位置的功能

    希望前輩們可以分享一些網站、範例,讓我有一些方向可以去研究

    像Socket 有個Server Clinet的區別,Memory Shared也會是一樣的感覺嗎?

    2017年3月15日 上午 06:25

解答

所有回覆

  • 1) 當C#程式與C++程式之間有大量的資料需要共用時就可以很適合使用 Memory Mapped Files(小量資料可以有很多的選擇)

    2) Memory Mapped Files可以不需要對應到實際的檔案, 請參考:MemoryMappedFile.CreateNew Method (String, Int64)

    3) 讀寫未對應到檔案的 Memory Mapped Files類似讀寫記憶體

    • 已標示為解答 open852134 2017年3月16日 上午 03:08
    2017年3月15日 上午 07:05
  • 感謝大大!!

    我已我需要去看的部分主要就是 MemoryMappedFile 的使用方法嘛!!!!

    2017年3月15日 上午 08:04
  • 大量資料用這種方式較有效率
    2017年3月16日 上午 01:09
  • 感謝前輩指導!!

    資料量我是不確定多大,不過這個方法是業主提的

    所以我想我只能用這個方法!!  ^_^

    2017年3月16日 上午 03:08
  • 前輩你好 我想在請問一下

    我剛剛測試了 https://goo.gl/Gy6GWK 裡面的範例

    在Program A裏頭,像這段程程式個是宣告一個記憶體位置出來

    並命名為 testmap 

    MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000)

    在Profram B裏頭,是開啟名為testmap 的記憶已位置

    並且寫入一個0

    MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap")
    
    using (MemoryMappedViewStream stream = mmf.CreateViewStream(1, 0)){
        BinaryWriter writer = new BinaryWriter(stream);
        writer.Write(0);
    }

    到這邊對程式的理解應該沒什麼問題吧

    我想請教的是,所以像我的需求是與C++程式通訊

    那是不是C++也會有一段程式像Program A 有一個建立名稱

    然後再C#部分程式就像 Program B 一樣對應那個名稱寫值或讀值

    簡單說就是我C#在MemoryMappedFile.OpenExisting("testmap")

    要怎麼知道對應到C++程式我應該寫成怎樣

    2017年3月16日 上午 07:19