मैं कुछ विरासत कोड को प्रबंधित करने के लिए ऐपडोमेन का उपयोग करके विचारों का प्रयोग कर रहा हूं जिसमें बहु-थ्रेडेड वातावरण में बहुत से स्थिर फ़ील्ड हैं।ऐपडोमेन में स्टेटिक फ़ील्ड
मैं जवाब इस सवाल पढ़ें: How to use an AppDomain to limit a static class' scope for thread-safe use?, सोचा था कि यह काफी आशाजनक है और विधानसभा ClassLibrary1.dll में एक बहुत ही सरल वर्ग के साथ इसे आज़माने का फैसला किया:
namespace ClassLibrary1
{
public static class Class1
{
private static int Value = 0;
public static void IncrementAndPrint()
{
Console.WriteLine(Value++);
}
}
}
और यहाँ मेरे कोड है कि assemblyinto 2 अलग लोड करता है एप्लिकेशन डोमेन और IncrementAndPrint का आह्वान() कई बार:
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var assemblyInAppDomain1 = appDomain1.Load("ClassLibrary1");
var assemblyInAppDomain2 = appDomain2.Load("ClassLibrary1");
var class1InAppDomain1 = assemblyInAppDomain1.GetType("ClassLibrary1.Class1");
var class1InAppDomain2 = assemblyInAppDomain2.GetType("ClassLibrary1.Class1");
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
class1InAppDomain2.InvokeMember("IncrementAndPrint", BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod, null, null, null);
मैं उम्मीद कर रहा था उत्पादन होने के लिए:
0
1
2
0
1
2
क्योंकि स्थैतिक फ़ील्ड की एक प्रति होगी AppDomain के प्रत्येक उदाहरण के लिए स्थानीय मान। हालांकि, इसके बजाय मुझे जो मिला:
0
1
2
3
4
5
जो मुझे बताता है कि वे अभी भी सभी स्थिर फ़ील्ड मान की एक ही प्रति साझा कर रहे हैं। क्या कोई मुझे बता सकता है कि मैंने यहां क्या गलत किया है?
अद्यतन:
मैं एरिक के सुझाव की कोशिश की, अब मैं CreateInstanceAndUnwrap फोन() के बजाय लोड() और GetType (बुलाने की AppDomain वर्ग की विधि) के रूप में नीचे दिखाया गया है। साथ ही, मैंने एक स्थिर विधि के बजाय एक उदाहरण विधि में वृद्धि और प्रिंट को परिवर्तित कर दिया है। हालांकि, मुझे अभी भी एक ही परिणाम मिल रहा है।
var appDomain1 = System.AppDomain.CreateDomain("AppDomain1");
var appDomain2 = System.AppDomain.CreateDomain("AppDomain2");
var class1InAppDomain1 = (Class1)appDomain1.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
var class1InAppDomain2 = (Class1)appDomain2.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain1.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
class1InAppDomain2.IncrementAndPrint();
आप टी कॉल कर रहे हैं वह वर्तमान ऐप डोमेन में स्थिर विधि है। आपको एक इंस्टेंस विधि बनाने की आवश्यकता है जो कक्षा 1 कक्षा पर स्टेटिक विधि को कॉल करे। –
हाय एरिक, यदि आपने मेरे अपडेट किए गए सोर्स कोड पर एक नज़र डाली है, तो मैंने एक एपमेंट विधि में वृद्धि और प्रिंटर() को परिवर्तित कर दिया है और संबंधित ऐप डोमेन में उदाहरण बनाने के लिए CreateInstanceAndUnWrap() का उपयोग किया है। हालांकि, मुझे अभी भी एक ही परिणाम मिल रहा है – oscarkuo
मैं पूरी तरह से आपके ऐपडोमेन मॉडल पर 'MarhsalByRefObject' का उल्लेख करना भूल गया। –