2015-01-30 6 views
54

मेरे पास एक पुस्तकालय है जिसमें एक स्थिर क्षेत्र है। मैं एक ऐप बनाना चाहता हूं और इस लाइब्रेरी को संदर्भित करना चाहता हूं इसलिए मेरे पास इस स्थिर क्षेत्र के दो उदाहरण होंगे। .NET रनटाइम एक ही लाइब्रेरी को दो बार संदर्भित करने की अनुमति नहीं देता है, लेकिन मुझे आश्चर्य है कि इस सीमा को दूर करना संभव है?स्थिर संदर्भ हमेशा सी # में एकल है?

मुझे पुस्तकालय बदलने की अनुमति नहीं है, लेकिन मैं इसे कॉपी/नाम बदल सकता हूं।

उत्तर

84

यह आपके जैसा लगता है उतना पागल नहीं है। वास्तव में, आप इसे AppDomains का उपयोग करके प्राप्त कर सकते हैं।

प्रत्येक AppDomain में स्थिर चर के लिए अपना स्वयं का संग्रहण स्थान है। तो आप अपनी प्रक्रिया में केवल एक दूसरा ऐपडोमेन बना सकते हैं, और MarshalByRefObject से this MSDN example में प्राप्त ऑब्जेक्ट का उपयोग करके उनके बीच संवाद कर सकते हैं।

+3

मुझे आपका जवाब पसंद आया, क्या आप कृपया कुछ मीठा लोके प्रदान कर सकते हैं :) –

+0

@ जेरेमी [एमएसडीएन लिंक] (https://msdn.microsoft.com/en-us/library/system.appdomain.aspx) मेरे से उत्तर में प्रॉक्सी का उपयोग कर एक पूर्ण क्रॉस ऐप-डोमेन संचार उदाहरण है। –

+3

यह * पागल * नहीं हो सकता है, लेकिन यह निश्चित रूप से मेरे लिए थोड़ा "खराब आर्किटेक्चर अलर्ट" रिंग करता है। – Falanwe

57

जबकि ऐपडोमेन्स पर Lucas' suggestion काम करेगा, वैकल्पिक रूप से आप जेनेरिक का उपयोग करके इस प्रभाव को बना सकते हैं, क्योंकि विभिन्न सामान्य प्रकार के तर्कों के साथ एक वर्ग को एक अलग वर्ग के रूप में माना जाता है, और इसलिए इसका अपना स्थिर क्षेत्र होता है।

public class SomeClass<T> 
{ 
    public static string SomeField; 
} 

तब:

SomeClass<int>.SomeField = "A"; 
SomeClass<string>.SomeField = "B"; 

Console.WriteLine(SomeClass<int>.SomeField); // A 
Console.WriteLine(SomeClass<string>.SomeField); // B 

उदाहरण के लिए, SomeClass<int>, पुस्तकालय में निर्धारित किया जाएगा, जबकि SomeClass<string> अपनी कॉपी किया जाएगा। बेशक यह केवल तभी काम करेगा यदि आप पुस्तकालय बदल सकते हैं, या लाइब्रेरी पहले से ही जेनेरिक इस्तेमाल कर सकते हैं।

+49

यह जेनेरिक के सबसे सुंदर और भयानक दुर्व्यवहारों में से एक है जिसे मैंने कभी देखा है। –

+2

@BradleyUffner जब तक आप सी ++ – immibis

+3

में सीआरटीपी सिंगलेट्स देखते हैं, तब तक प्रतीक्षा करें, लेकिन वे अलग-अलग फ़ील्ड हैं, न कि एक ही स्थैतिक क्षेत्र के दो उदाहरण हैं। –

1

दोनों सुझावों को काम करना चाहिए, लेकिन वे वास्तुकला से संबंधित सभी भयानक हैं।

मुझे संदर्भ के बारे में पता नहीं है, लेकिन आपके मामले में केवल एक नई संपत्ति के साथ एकत्रीकरण वर्ग बनाना संभव है जो स्थैतिक नहीं है और केवल दो उदाहरण हैं। यह ध्वनि मेरे लिए बेहतर तरीका है।

हर बार मेरे पास स्मार्ट कोड है, मेरे सिर में एक चेतावनी शुरू होती है। एक डेवलपर के लिए स्मार्ट कोड हमेशा बहुत चालाक है।

+1

मैं इसके परिणामों के बारे में पूरी तरह से अवगत हूं। मैं समझा रहा था कि सवाल की शुरुआत में, लेकिन मॉडरेटर ने ऑफटॉप के कारण इस हिस्से को हटा दिया है। मेरे पास एक तृतीय पक्ष लाइब्रेरी है जिसे मैं बदलने में सक्षम नहीं हूं जिसमें कार्यक्षमता की मुझे दो बार आवश्यकता है, लेकिन यह स्थिर है इसलिए मैं इसे केवल एक बार उपयोग कर सकता हूं। मैंने पुस्तकालय के निर्माता से इस बारे में पूछा, और उसकी प्रतिक्रिया हैक का उपयोग करने की कोशिश करना था क्योंकि इसे फिर से डिजाइन करना बहुत मुश्किल है। दो डोमेन रखने के दृष्टिकोण में अच्छा काम किया, और यह काफी आसान और उपयुक्त दिखता है (सिवाय इसके कि आपको जीवन भर का प्रबंधन करना है), इसलिए मैं इसके साथ अच्छा हूं। – Archeg

+0

लेकिन आप सही हैं - यह इंगित करना महत्वपूर्ण है कि आपको इस तरह के दृष्टिकोण के साथ नहीं जाना चाहिए जबतक कि आपको वास्तव में वास्तव में नहीं करना है – Archeg

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