2009-01-13 11 views
16

मेरे पास एक सी ++ है .NET ऐप और एक सी # .NET ऐप। मैं उन्हें साझा स्मृति के माध्यम से संवाद करना चाहता हूं।साझा स्मृति को .NET में कैसे कार्यान्वित करें?

कैसे यह नेट संस्करण 2.0 में संभव है?

मुख्य रूप से एक कतार वस्तु साझा करना चाहते हैं।

उत्तर

6

कई विकल्प अपने अनुप्रयोगों से संवाद करने के लिए कर रहे हैं। सबसे लोकप्रिय रिमोटिंग और पाइप्स हैं। दोनों को चुनने से पहले और आपके लिए कई उदाहरण हैं, आपको पोर्टेबिलिटी जैसे पेशेवरों और विपक्षों पर विचार करना चाहिए। यहाँ कुछ उपयोगी लिंक कर रहे हैं:

Inter-Process Communication in .NET Using Named Pipes, Part 1

Inter-Process Communication in .NET Using Named Pipes, Part 2

.NET Remoting in Simple English

.NET Remoting with an easy example

+4

यह एक अच्छा जवाब है और सब कुछ सवाल साझा स्मृति के बारे में था। –

3

साझा स्मृति है ही एकमात्र विकल्प? संवाद करने के लिए दो .NET प्रक्रियाओं के कई तरीके हैं। उनमें से कुछ हैं:

  • .NET Remoting ऑब्जेक्ट - ऑब्जेक्ट्स को प्रक्रियाओं में एक दूसरे के साथ बातचीत करने की अनुमति दें। प्रक्रियाओं के बीच एक साझा संदेश कतार - वहाँ एक अच्छा कोड नमूना here
  • माइक्रोसॉफ्ट संदेश कतार (MSMQ) है। एमएसएमक्यू एक और विंडोज सेवा के रूप में चलाएगा।
1

मुझे लगता है नेट v2.0 साझा स्मृति के लिए समर्थन में निर्मित नहीं है। अधिकतर हम CreateFileMapping और MapViewOfFile API को PInvoke कर सकते हैं।

मेरी परिदृश्य में भारतीय दंड संहिता एक मशीन पर जगह ले जाना चाहिए। तो पाइप अब के रूप में सबसे तेज़ विकल्प है।

जवाब

13

अद्यतन के लिए धन्यवाद: अरे, here's a page मैं सिर्फ एक compleate implmentation साथ मिल गया।


C++/CLI का उपयोग करना, यह काफी प्रति सामान्य सी ++ एपीआई के रूप में सेटअप साझा स्मृति आसान है (C++/CLI में कामयाब रहे और देशी ढेर/स्मृति संदर्भ के साथ बातचीत करने के लिए सक्षम किया जा रहा)। UnmanagedMemoryStream का उपयोग तब स्ट्रीम ऑब्जेक्ट को सी # में बेनकाब करने के लिए किया जा सकता है।

मैं ज फ़ाइल संलग्न नहीं था, लेकिन आप काफी easially pmapped देशी typedef के लेआउट अनुमान लगा सकते हैं;)। आप अपने पाठक/लेखक उपयोग के मामले के आधार पर बुफर्डस्ट्रीम के संभावित उपयोग का मूल्यांकन भी कर सकते हैं। और कोड एक प्रोजेक्ट से है जिसे मैं अब और उपयोग नहीं करता इसलिए मुझे इसके बग रिग्रेशन की स्थिति याद नहीं है।

यहाँ C++/CLI वर्ग, जिसके कारण फ़ाइल मानचित्रण स्थापित करता है और उजागर करता एक UnmanagedMemoryStream है;

public ref class MemMapp 
{ 
    public: 
     __clrcall MemMapp(String^ file) 
     { 
      map = NULL; 

      if(!File::Exists(file)) throw gcnew ApplicationException("Can not find file " + file); 

      marshal_context^ x = gcnew marshal_context(); 
      const char *nname = x->marshal_as<const char*>(file); 

      map = (pmapped) malloc(sizeof(mapped)); 
      ZeroMemory(map, sizeof(mapped)); 
      map->name = strdup(nname); 
      InitMap(map); 
     } 
     void __clrcall MapBytes(long long loc, long length) 
     { 
      map->low = loc & 0xffffffff; 
      map->high = (loc >> 32) & 0xffffffff; 
      map->size = length & 0xffffffff; 
      if(!GetMapForFile(map)) 
       throw gcnew ApplicationException("can not map range " + loc + " :" + length); 

      if(map->size = 0) 
       map->size = MAXMAX&0xffffffff; 

     } 
     UnmanagedMemoryStream ^View() 
     { 
      return gcnew UnmanagedMemoryStream((unsigned char *) map->blok, map->size, map->size, FileAccess::Read); 
     } 
     long long __clrcall FileSize() 
     { 
      DWORD high, low; 
      long long rv; 

      low = GetFileSize(map->hFile, &high); 
      maxmax = high; 
      maxmax << 32; 
      maxmax += low; 

      rv = high; 
      rv << 32; 
      rv = rv & low; 
      return rv; 
     } 
     property unsigned int MinBufSiz { unsigned int get() { return map->dwbufz; } } 
     property long long BufBase { long long get() { return (map->high << 32) + map->low; } } 
     property long long BufLim { long long get() { return ((map->high << 32) + map->low) + map->size; } } 
     property long long MAXMAX { long long get() { return maxmax; } } 
     static MemMapp() { } 
     __clrcall ~MemMapp() { if(map != NULL) { CloseMap(map); free(map->name); free(map); map = NULL; } } 
    protected: 
     __clrcall !MemMapp() { if(map != NULL) { CloseMap(map); free(map->name); free(map); map = NULL; } } 
     pmapped map; 
     long long maxmax; 
}; 

यहाँ कम से कम CLoseMap है ... मैं सिर्फ यह पाया ...यह/CLR के साथ संकलित नहीं किया गया था


bool CloseMap(pmapped map) 
{ 
    if(map->blok != NULL) { 
     UnmapViewOfFile(map->blok); 
     map->blok = NULL; 
    } 
    if(map->hMap != INVALID_HANDLE_VALUE && map->hMap != NULL) { 
     CloseHandle(map->hMap); 
     map->hMap = INVALID_HANDLE_VALUE; 
    } 
    if(map->hFile != INVALID_HANDLE_VALUE && map->hFile != NULL) { 
     CloseHandle(map->hFile); 
     map->hFile = INVALID_HANDLE_VALUE; 
    } 
    return false; 
} 
+2

+1 .net 4 मेमोरी मैप की गई फ़ाइलों के लिए समर्थन है http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.aspx – kenny

3

आप भी अपनी सी # अनुप्रयोग में Win32 कार्यों का आयात के रूप में C++/CLI के लिए एक विकल्प है:

[DllImport ("kernel32.dll", SetLastError = true)] 
    static extern IntPtr CreateFileMapping (IntPtr hFile, 
              int lpAttributes, 
              FileProtection flProtect, 
              uint dwMaximumSizeHigh, 
              uint dwMaximumSizeLow, 
              string lpName); 

    [DllImport ("kernel32.dll", SetLastError=true)] 
    static extern IntPtr OpenFileMapping (FileRights dwDesiredAccess, 
             bool bInheritHandle, 
             string lpName); 

    [DllImport ("kernel32.dll", SetLastError = true)] 
    static extern IntPtr MapViewOfFile (IntPtr hFileMappingObject, 
             FileRights dwDesiredAccess, 
             uint dwFileOffsetHigh, 
             uint dwFileOffsetLow, 
             uint dwNumberOfBytesToMap); 
    [DllImport ("Kernel32.dll")] 
    static extern bool UnmapViewOfFile (IntPtr map); 

    [DllImport ("kernel32.dll")] 
    static extern int CloseHandle (IntPtr hObject); 
संबंधित मुद्दे