2010-03-11 59 views
3

我基本上正在尋找一種方法來跨程序/進程傳遞實例而不是序列化在.NET 4.0中的實例。是否可以通過內存映射文件將實例「指針」傳遞給另一個進程?

是的,我很想念我的好醇」 100%不安全的指針;)

我以爲內存映射文件到.NET 4.0的新的整合將幫助我,看過的地方,你可以通過引用/指針「本地」使用它。

然而,當我嘗試像

var mmf = MemoryMappedFile.CreateFromFile(@"C:\temp\test.mp", FileMode.Create, "mmf", 
              1024*1024*300, 
              MemoryMappedFileAccess.ReadWrite); 
var ss = new SimpleStruct(); 
ss.items = _items; //Collection of Items objects 
var FileMapView = mmf.CreateViewAccessor(); 
FileMapView.Write<SimpleStruct>(0, ref ss); //Exception 

我得到以下的ArgumentException:

The specified Type must be a struct containing no references. 

是否可以繞過使用MMF引用?如果不是,是否有任何方法在所有傳遞程序/進程的實例?

回答

3

這在非託管代碼中也是不可能的,一個指針值在另一個進程中沒有意義。託管對象位於垃圾收集堆上,這絕不會與MMF視圖的地址重合。即使它以某種方式做了,垃圾收集器也會造成嚴重破壞。主要原因是爲了支持MMF的4個.NET版本。

序列化管理對象到視圖是不可避免的。

+0

我可以很容易從上下文中推斷出數據的含義,即數據的類型。這基本上意味着我會知道如何將我的「空白」指針轉換回它的真實類型。這兩個過程當然會共享一個定義一些常見類型的通用程序集。我想我會喜歡看到的是* pin *託管實例的能力,就像您可以使用非託管類型一樣。 – 2010-03-11 04:08:12

+0

它不能通過設計工作。被管理對象的內存佈局是不可發現的。例如,JIT編譯器通過對結構的字段進行重新排序來利用該優勢,以實現正確的對齊和最小的總大小。投射一個IntPtr需要Marshal.PtrToStructure()。受管版本的memcpy()。 – 2010-03-11 04:20:42

相關問題