2011-01-14 5 views
5

मेरे पास एक आउट-ऑफ-प्रोसेस COM सर्वर है जिसे चीजों पर नजर रखने की आवश्यकता है। यह सर्वर एक सेवा के रूप में चलता है और आंतरिक रूप से, एक सिंगलटन है। सादगी के लिए, मैं उसे बॉसकॉम कहूंगा।मैं प्रक्रिया सीमाओं में एक आउट-ऑफ-प्रोसेस COM संदर्भ कैसे मार्शल कर सकता हूं?

मेरे पास एक अन्य आउट-ऑफ-प्रोसेस COM सर्वर है जो एक कार्यकर्ता है। यह सिस्टम स्थिरता के लिए है, एक एकल उपयोग सर्वर (जिसका अर्थ है कि यदि आप 2 वर्करकॉम बनाते हैं, तो 2 वर्करकॉम.एक्सई चल रहे हैं)। सादगी के लिए, मैं उसे वर्करकॉम कहूंगा।

वर्करकॉम किसी भी चीज से शुरू किया जा सकता है, यहां तक ​​कि यदि कोई व्यक्ति उसे कमांड लाइन तर्क के साथ कमांड लाइन के माध्यम से चलाता है।

बॉसकॉम के लिए कुल लक्ष्य यह है कि वर्करकॉम क्या हैं, पता है कि वे क्या कर रहे हैं, और उन्हें ऑर्डर देने (रोकें, रोकें, रैंप अप करें) आदि।

मेरा प्रारंभिक विचार यह होगा कि जब भी वर्करकॉम शुरू होता है, तो वह एक बॉसकॉम को सहक्रिया स्थापित करेगा और बॉसकॉम-> रजिस्टरवॉर्कर (मुझे अज्ञात) कॉल करेगा। फिर जब वर्करकॉम बंद होने जा रहा है, तो वह बॉसकॉम-> UnregisterWorker (मुझे अज्ञात) कहलाएगा। BossCom IWorkerCom के लिए IU अज्ञात QueryInterface कर सकता है और आदेश जारी करने में सक्षम हो सकता है।

यह बहुत अच्छा काम करेगा यदि ये सभी कॉम ऑब्जेक्ट एक ही प्रक्रिया में थे, लेकिन वे नहीं हैं। मैंने ग्लोबलइंटरफेसटेबल का उपयोग करने के बारे में सोचा, लेकिन यह केवल एक प्रक्रिया के अर्थ में वैश्विक है।

मैंने इस पर शोध करने में कुछ दिन बिताए हैं और नुकसान में हैं। शायद मैं सुरंग दृष्टि से हूँ।

मैं वर्कर से बॉस के कॉम ऑब्जेक्ट का संदर्भ कैसे मार्शल कर सकता हूं?

ओह, और, इसके लायक होने के लिए, बॉसकॉम सी # में लिखा गया है और वर्करकॉम एटीएल सी ++ में लिखा गया है लेकिन मैं वीबी, स्कैला, लिस्प, या कुछ भी में लिखित समाधान लेगा। मुझे लगता है कि मैं मूल विचार का अनुवाद कर सकता हूं। :-)

+3

यह सिर्फ काम नहीं करता है? मैं मानता हूं कि मैंने COM के साथ कुछ भी नहीं किया है, लेकिन इसका पूरा बिंदु प्रक्रिया से बाहर है कि आप प्रक्रिया सीमाओं में मार्शल कॉल के लिए पहले से ही COM प्राप्त कर रहे हैं, है ना? –

+0

सही, ज्यादातर चीजों के लिए, लेकिन अज्ञात सिर्फ एक सूचक है, है ना? वर्करकॉम में "यह" पॉइंटर बॉसकॉम में कोई महत्व नहीं होगा? या मार्शलिंग प्रक्रिया महत्व रखेगी। मुझे लगता है मुझे कम से कम कोशिश करनी चाहिए। –

+2

इसे बंद करना चाहिए-शेल्फ को छेड़छाड़ करने के लिए प्रॉक्सी/स्टब्स या टाइपेलिब दिए गए हैं। वास्तव में इसके लिए marshalling बिल्कुल है - एक ग्राहक को एक नकली वस्तु ("प्रॉक्सी") देने के लिए जो सर्वर पर प्रतिबिंबित है। यह कोड परिप्रेक्ष्य से पारदर्शी रूप से काम करता है। – sharptooth

उत्तर

2

टिप्पणियों के अनुसार, यह वास्तव में बॉक्स से बाहर काम करता है। एक अतिरिक्त विवरण है हालांकि यह काम करता है।

मूल रूप से जब मैं सी # इंटरफेस को देख रहा था जो इंटरफेस की प्रतिलिपि बनाने के साथ निपटा था, तर्क प्रकार IntPtr था। खैर, एक इंटिप्रेट सिर्फ एक लंबा है, इसलिए यह मान को स्थानांतरित करता है और, जैसा कि काम नहीं करता है।

तर्क पर मार्शल एट विशेषता को सेट करना महत्वपूर्ण है। तो मेरी RegisterWorker विधि इस तरह दिखती है:

public void RegisterWorker(
     [In, MarshalAs(UnmanagedType.IUnknown)] object ptr 
     ) 
    { 
     IWorkerCom worker = (IWorkerCom) ptr; 
     Workers.Add(worker); 
    } 

उत्थान अद्भुत।

1

मुझे हाल ही में कुछ ऐसा करना पड़ा और पाया कि साझा स्मृति का उपयोग करना मेरे लिए बहुत अच्छा काम करता है। बॉसकॉम साझा स्मृति बना और बना सकता है और श्रमिक साझा स्मृति में प्रवेश करके पंजीकरण कर सकते हैं। मैं किस बारे में बात कर रहा हूं, इसके लिए MSDN link यहां है। मेमोरी तक पहुंच को सिंक्रनाइज़ करने के लिए एक म्यूटेक्स का उपयोग करना याद रखें ...

+0

यह पंजीकरण को ठीक से संभालता है, लेकिन मैं अस्पष्ट हूं कि यह श्रमिकों के आदेश और नियंत्रण में कैसे मदद करता है। –

+0

साझा स्मृति बस स्क्रैचपैड के माध्यम से संचार करने का एक तरीका है। बॉसकॉम आदेशों को स्मृति में लिख सकता है और श्रमिकों की प्रतीक्षा करने वाले एक कार्यक्रम को संकेत दे सकता है। ऐसा करने के कई अन्य तरीके हैं और यह सब आपकी सुरक्षा आवश्यकताओं पर निर्भर करता है। मैंने अभी यह दृष्टिकोण लागू करने और बहुत लचीला करने के लिए बहुत जल्दी पाया है। – T33C

+0

मैं इस विचार की सराहना करता हूं, लेकिन यूएसी इसे और अधिक कठिन बनाता है। मेरा आवेदन विंडोज एक्सपी और ऊपर में चलाना है। एपीआई जो यूएसी उपयोगकर्ता सीमाओं में साझा स्मृति को प्रयोग योग्य बनाती है XP में मौजूद नहीं है। मैंने अतीत में इस बारे में काम किया है, लेकिन मैं इसे फिर से करने के लिए उत्सुक नहीं हूं। –

1

आप सी # में marshalable इंटरफेस बनाने में सक्षम होने में थोड़ा सीमित हैं। प्रॉक्सी सेट करने का कोई आसान तरीका नहीं है। एटीएल में ऐसी कोई समस्या नहीं है, आईडीएल में कॉलबैक इंटरफ़ेस घोषित करें। और RegisterWorker() कॉल के साथ एक उदाहरण सूचक पास करें। सर्वर को तब तक स्टोर करना चाहिए जब तक कि यह अनियंत्रित कॉल न हो जाए। सूचनाएं उत्पन्न करने के लिए उस कॉलबैक इंटरफ़ेस का उपयोग करें।

2

आपको Monikers पर एक नज़र डालना चाहिए, जिसका उपयोग विभिन्न मशीनों पर भी COM ऑब्जेक्ट उदाहरण की पहचान करने के लिए किया जाता है।

+0

यह दिलचस्प है। और यह संभवतः मेरे प्रोजेक्ट के अन्य हिस्सों को आसान बना देगा। मुझे डायरेक्टशो के साथ काम करना याद है, मोनिकर्स सिर्फ टेक्स्ट स्ट्रिंग थे। उनको मार्शल बेहद आसान होना चाहिए। बिल्ली, मैं उन्हें एक ईएसई तालिका में भी डाल सकता था ताकि कोई भी (अन्य श्रमिकों की तरह) उन्हें ढूंढ सके। एक त्वरित खोज यह नहीं दिखाती कि मैं अपने ऑब्जेक्ट के लिए एक मोनिकर कैसे बना सकता हूं। कोई संकेतक? –

+0

शायद CreateObjrefMoniker? –

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

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