मैं एक एक्सेल प्लग में (सी # में लिखा) एक स्थिर चर एक सिंगलटन डेटा कैश के मूल में है कि के साथ:एक्सेल दो अलग-अलग ऐपडोमेन से .NET स्वचालन सर्वर का आह्वान करता है?
static DataCache _instance;
यह तीन अलग-अलग कोड रास्तों के माध्यम से पहुंचा जा सकता है:
-
एक VSTO रिबन पट्टी पर
- घटना संचालकों उदाहरण प्रारंभ, और भी सहायक संवाद में प्रदर्शन के लिए इसे पढ़ा
- एक RTD सर्वर (एक वर्ग है कि [ComVisible] की घोषणा की और IRtdServer इंटरफ़ेस लागू करता है) डेटा का इस्तेमाल करता RTD सूत्रों के लिए
- ऑटोमेशन कॉल का एक सेट (घोषित किया गया एक और वर्ग में लागू [कॉमविज़िबल]) भी डेटा पर काम करता है। इन्हें वीबीए कोड के माध्यम से बुलाया जाता है जिसे एक्सेल वर्कशीट पर बटन क्लिक किए जाने पर बुलाया जाता है।
संपादित करें (# 3):
जिस क्रम में इन कोड रास्तों पहले लागू कर रहे हैं पर निर्भर करता है, मुझे लगता है कि मेरी कोड दो अलग-अलग AppDomains में चलाता है पाते हैं।
रिबन-बार ईवेंट हैंडलर से सभी पहुंच "MyPlugIn.vsto" नामक ऐपडोमेन में होती है। यदि यह मेरी COM ऑब्जेक्ट की पहली पहुंच है, तो सभी बाद की कॉल (आरटीडी कॉल सहित) एक ही ऐपडोमेन में होती है।
हालांकि अगर पहली पहुंच आरटीडी इंटरफ़ेस के माध्यम से होती है, तो वह कॉल और बाद में आरटीडी कॉल "DefaultDomain" नामक ऐपडोमेन में होती है। (यह तब होता है जब एम्बेडेड आरटीडी सूत्रों के साथ सहेजे गए दस्तावेज़ को लोड करते हैं।) टूलबार के माध्यम से डेटा कैश को प्रारंभ करने और कुशलतापूर्वक उपयोग करने के लिए बाद में कॉल "MyPlugIn.vsto" AppDomain में होती है। इसका मतलब है कि आरटीडी सूत्र हमेशा चलते हैं जैसे डेटा कैश प्रारंभ नहीं किया गया था (चूंकि एक ऐपडोमेन में स्थैतिक परिवर्तनीय सेट दूसरे में अनियंत्रित रहता है)।
ऐसा प्रतीत होता है कि एक्स्ट्रा या वीएसटीओ वीएसटीओ शुरू होने पर ऐपडोमेन बना रहा है। इस प्रारंभिकरण से पहले COM इंटरऑप के माध्यम से बनाए गए ऑब्जेक्ट्स डिफ़ॉल्ट AppDomain में भूमि, जबकि ऑब्जेक्ट्स बाद में VSTO AppDomain में भूमि बनाते हैं।
मैं कैसे सुनिश्चित कर सकता हूं कि उसी डेटा कैश उदाहरण का उपयोग किया जाता है, इससे कोई फर्क नहीं पड़ता कि मेरे आरटीडी सर्वर ऑब्जेक्ट में कौन सा ऐपडोमेन बनाया गया है?
आपका क्या मतलब है 'मेरी सिंगलटन वस्तु ठीक से साझा नहीं कर रहा है'? क्या यह ऑब्जेक्ट का प्रारंभिकरण है, जैसा कि @ mhttk सुझाता है, या आप दावा कर रहे हैं कि अलग-अलग धागे उस चर में अलग-अलग स्थिति देखते हैं (जो बहुत अजीब लगता है), या कुछ और? – Rory
@ रोरी - एक धागे में, _instance प्रारंभ हो जाता है। उसी धागे से बाद की कॉल में, यह अभी भी अपेक्षित के रूप में शुरू किया गया है। हालांकि जब कोई अन्य थ्रेड इसे एक्सेस करने का प्रयास करता है (कई मिनट बाद - यह एक समय मुद्दा नहीं है) यह शून्य है और उस थ्रेड द्वारा उपयोग के लिए पुनः आरंभ किया जाना चाहिए। – Eric
यह बहुत अजीब है ना? मेरे अनुभव मेंनेट COM इंटरऑप (इंटरनेट एक्सप्लोरर के साथ जो समान है लेकिन स्पष्ट रूप से अलग है), ऐसा नहीं होता है। क्या यह COM अपार्टमेंट के साथ एक सामान्य बात है? क्या आप वाकई एक ही प्रक्रिया में हैं? – Rory