2011-10-18 10 views
5

मुझे पढ़ने और प्रदर्शित करने के लिए क्लाइंट एप्लिकेशन के लिए साझा मेमोरी में फ़ील्ड अपडेट करने के लिए मेरी सेवा की आवश्यकता है। मुझे Session 0 Isolation की वजह से मेरा वर्तमान समाधान अप्रभावी होने का पता चला है।विंडोज सेवा और एप्लिकेशन के बीच मेमोरी साझा करना, सबसे आसान क्या है?

मैं वैश्विक नाम स्थान जो उस तत्व को ठीक करता में mutex तों नाम दिया है, लेकिन यह करने के लिए सत्र 0 अलगाव किया जा रहा है एक समाधान के बावजूद नहीं लगती है जैसे कि dll उत्तरदायी हो जाएगा सत्र के बीच साझा करने के लिए:

"किसी भी नामित ऑब्जेक्ट्स, जैसे ईवेंट या मैप किए गए मेमोरी के लिए स्पष्ट रूप से स्थानीय \ या ग्लोबल \ नेमस्पेस का चयन करें जो सेवा उपलब्ध कराता है।"

मुझे नहीं पता कि डीएल के किस हिस्से को नामित वस्तु के रूप में वर्गीकृत किया जा सकता है और इसे फिर से इंस्टॉल करने और जांचने के लिए इसे आगे बढ़ाने में बहुत लंबा समय लगेगा।

मैंने नामित चैनलों के लिए कोड वॉल्यूम देखा और इसे हटा दिया गया। मैं डिस्क को छूने वाली फ़ाइल नहीं बनाना चाहता हूं क्योंकि मुझे लगता है कि मेमोरी मैप्डफाइल समाधान की आवश्यकता है। काम करने के लिए डीएलएस के वर्ग साझा किए जा सकते हैं? अन्यथा सबसे आसान क्या है?

public ref class ServerGUIBridge 
{ 
public: 
#pragma data_seg(".sdata") 
    static int commonIntShouldBeGlobal = 0; 
    static bool hasBeenInitializedMakeMeGlobal = false; 
#pragma data_seg() 
#pragma comment(linker, "/section:.sdata,rws") 

मैं .NET 2.0 का उपयोग कर रहा हूं इसलिए कोई डब्ल्यूसीएफ कृपया नहीं।

+0

यदि आप स्मृति-मैप की गई फ़ाइल INVALID_FILE_HANDLE के साथ बनाते हैं, तो कोई फ़ाइल नहीं बनाई गई है। यह सिर्फ स्मृति है जो थोड़ी देर तक पहुंचने पर बाहर निकलती है। ध्यान दें कि साझा अनुभाग एक सुरक्षा छेद हैं - आप साझा अनुभाग पर एसीएल नहीं डाल सकते हैं। (क्या होता है यदि कोई क्लाइंट चला जाता है और करता है 'हैबिनइंस्टाईलाइज्ड मेकमेग्लोबल = झूठा' या 'सामान्य इंटेलशॉल्डबीग्लोबल = रैंड() '?) –

+0

@ रेमंड" अगर एचएफआईएल INVALID_HANDLE_VALUE है, तो कॉलिंग प्रक्रिया को भी dimMaximumSizeHigh में फ़ाइल मैपिंग ऑब्जेक्ट के लिए आकार निर्दिष्ट करना होगा और dwMaximumSizeLow पैरामीटर। इस परिदृश्य में, CreateFileMapping एक निर्दिष्ट आकार के फ़ाइल मैपिंग ऑब्जेक्ट बनाता है जिसे फ़ाइल सिस्टम में फ़ाइल के बजाय सिस्टम पेजिंग फ़ाइल द्वारा समर्थित किया जाता है। " - अगर सिस्टम पेजिंग फ़ाइल बंद है तो इसका समर्थन कहाँ किया जाता है? – John

+1

"सिस्टम पेजफाइल द्वारा समर्थित" खराब शब्द है। यह वास्तव में "वर्चुअल मेमोरी सिस्टम द्वारा समर्थित" होना चाहिए। यदि पेजफाइल अक्षम है, तो वर्चुअल मेमोरी सिस्टम सिर्फ भौतिक स्मृति है। –

उत्तर

0

रजिस्ट्री में आईपीसी की अक्सर अनदेखी विधि लिख रही है। दो पीओडी सदस्यों के लिए मैं यह साझा करने का प्रस्ताव करता हूं कि यह आदर्श समाधान होगा। IPC, MSDN, and the registry

0

सभी .NET फ्रेमवर्क संस्करण में रीमोटिंग सुविधा है। यह किसी अन्य ऐपडोमेन में विधियों को कॉल करने की अनुमति देता है जो अलग प्रक्रियाओं में हो सकता है। नमूने और उपयोग के लिए एमएसडीएन देखें: http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=VS.80).aspx

+0

मुझे वास्तव में रिमोटिंग के बारे में पता होना चाहिए। एक दिन। यह ओवरहेड के माध्यम से बहुत अधिक है क्योंकि यह अंतर-पीसी संचार से संबंधित है। – John

+0

रिमोटिंग उपलब्ध है लेकिन नए .NET संस्करणों के लिए अप्रचलित माना जाता है, जो अधिक लचीला (और जटिल?) डब्लूसीएफ द्वारा प्रतिस्थापित किया जाता है। –

1

मैं नामित पाइप का सुझाव दूंगा: तो आपके पास दो प्रक्रियाओं के बीच उचित नियंत्रित अलगाव है। डीएलएल साझा करना लगता है जैसे यह खतरे से भरा हुआ है।

नाम पाइप यहाँ MSDN पर लिखित हैं: http://msdn.microsoft.com/en-us/library/aa365590.aspx

और एक उपयोगी देख .NET 2.0 लेख यहाँ है: ध्यान रखें कि .NET 3.5 और अधिक एक NetNamedPipeBinding वर्ग [http://msdn.microsoft.com/en-us/library/system.servicemodel.netnamedpipebinding.aspx] है में http://www.switchonthecode.com/tutorials/interprocess-communication-using-named-pipes-in-csharp

(भालू वह डब्ल्यूसीएफ का हिस्सा है)

+0

मैंने एक बार एक उन्नत प्रक्रिया और सामान्य के बीच नामित पाइप साझा करने का प्रयास किया और यह संभव नहीं था। क्या कोई विशेष पैरामीटर सेट करने की आवश्यकता है? – RedX

संबंधित मुद्दे

 संबंधित मुद्दे