.NET कोर में कोई AppDomains नहीं! क्यों?


86

क्या कोई ठोस कारण है कि Microsoft ने .NET कोर में AppDomains का समर्थन नहीं किया?

AppDomains विशेष रूप से उपयोगी होते हैं जब लंबे समय तक चलने वाले सर्वर ऐप का निर्माण किया जाता है, जहां हम सर्वर द्वारा लोड किए गए असेंबली को अपडेट करना चाहते हैं, सर्वर को बंद किए बिना एक सुंदर तरीका है।

AppDomains के बिना, हम एक लंबी चलने वाली सर्वर प्रक्रिया में अपनी असेंबलियों को कैसे बदलने जा रहे हैं?

AppDomains हमें सर्वर कोड के विभिन्न भागों को अलग करने का एक तरीका भी प्रदान करता है। जैसे, एक कस्टम वेबसोकेट सर्वर में प्राथमिक एपडोमेन में सॉकेट कोड हो सकता है, जबकि हमारी सेवाएं द्वितीयक एपडोमेन में चलती हैं।

AppDomains के बिना, उपरोक्त परिदृश्य संभव नहीं है।

मैं एक तर्क देख सकता हूं जो विधानसभा परिवर्तनों को संभालने के लिए क्लाउड की VMs अवधारणा का उपयोग करने के बारे में बात कर सकता है और AppDadains के ओवरहेड को उकसाने के लिए नहीं है। लेकिन क्या यह माइक्रोसॉफ्ट सोचता है या कहता है? या उनके पास उपरोक्त परिदृश्यों के लिए एक विशिष्ट कारण और विकल्प हैं?


9
लेकिन .NET Core 5 .NET फ्रेमवर्क नहीं है । यह .NET CLR 4.6 का आगामी संस्करण नहीं है, लेकिन एक और अलग बात है तो चिंता न करें, AppDomain यहां रहने के लिए है।
एड्रियानो रेपेट्टी

2
मुझे वह दिखाई देता है, लेकिन अगर Microsoft यह दावा कर रहा है कि .NET कोर 5 मल्टी प्लेटफॉर्म (विंडोज / लिनक्स / यूनिक्स) होने जा रहा है, तो मुझे इस बात की उत्सुकता है कि वे AppDomain जैसी कोर फीचर को क्यों हटाना चाहते हैं।
आदित्य पसुमंथी

3
मुझे लगता है (लेकिन यह सिर्फ मेरी राय है) वे बहु-मंच तरीके से लागू करने के लिए कठिन हैं, वे कई चीजों को धीमा कर देते हैं और जटिलता जोड़ते हैं। इतने सारे लोग उनका उपयोग नहीं करते हैं (कम से कम ज्यादातर लोग इसे सीधे नहीं करते हैं)। यदि आपको उनकी आवश्यकता नहीं है, तो आप .NET कोर का उपयोग कर सकते हैं। यदि आपको उनकी आवश्यकता है ... तो इसका उपयोग न करें (सोचें कि ReFS बनाम NTFS)। बस .NET कोर। NET भविष्य (अब तक) नहीं है, लेकिन एक अलग परियोजना है। हो सकता है कि एक कार्यक्षेत्र हो, लेकिन निश्चित रूप से माइग्रेशन पथ या 1: 1 विकल्प नहीं है (कम से कम अब)।
एड्रियानो रेपेती

@ AdrianoRepetti: इसे उत्तर के रूप में जोड़ने पर विचार करें, क्योंकि मुझे लगता है कि यह उपयोगी है।
पैट्रिक हॉफमैन

@PatrickHofman यह सिर्फ मेरी राय है (दूसरी टिप्पणी), मैं समुदाय विकी के रूप में जवाब दे सकता हूं लेकिन मैं इस कर्तव्य को अधिक धाराप्रवाह अंग्रेजी के साथ किसी को छोड़ देता हूं !
एड्रियानो रेपेती

जवाबों:


50

.NETCore सबसेट का बिंदु .NET को छोटा रखना है । और पोर्ट करना आसान है। यही कारण है कि आप, कह सकते हैं कि Windows और OSX दोनों पर सिल्वरलाइट ऐप चलाएं और जब आप वेब पेज पर जाएं तो बहुत लंबा इंतजार न करें। संपूर्ण रनटाइम और फ्रेमवर्क को डाउनलोड करने और स्थापित करने में मुट्ठी भर सेकंड लगते हैं, देना या लेना।

इसे अनिवार्य रूप से छोटा रखने के लिए सुविधाओं में कटौती की आवश्यकता है। उस सूची में रिमोटिंग बहुत अधिक थी, यह काफी महंगा है। अन्यथा अच्छी तरह से छिपा हुआ है, लेकिन आप उदाहरण के लिए देख सकते हैं कि प्रतिनिधियों के पास अब एक कार्यात्मक BeginInvoke () विधि नहीं है। जिसने AppDomain को कट लिस्ट में डाल दिया है, आप बिना किसी सहायता के एप डोमेन में कोड नहीं चला सकते। तो यह पूरी तरह से डिजाइन द्वारा है।


12
IMHO का आकार से कोई लेना-देना नहीं है, लेकिन इस तथ्य के साथ कि CoreCLR में मजबूत नामकरण नहीं है, और इस प्रकार एक नई संलयन प्रणाली है और यह देखने का एक नया तरीका है कि विधानसभा क्या है, इसकी पहचान और इसे कहां लोड किया जाता है, कंटेनर के रूप में अर्थ का उपयोग करना अब उपयोगी नहीं है।
फ्राँस बूमा

7
हम्म, नहीं। डाउनलोड साइज को 6.6 एमबी तक रखने पर बेशक एक से अधिक फीचर हटाने की जरूरत होती है।
हंस पसंत

7
यदि आप मजबूत नामकरण का उपयोग नहीं कर रहे हैं तो भी AppDomains पूर्ण .NET में उपयोगी हो सकता है। (जैसे, AppDomains की गलती को अलग करने की क्षमता मजबूत नामकरण पर निर्भर नहीं करती है।) इसलिए मजबूत नामकरण को हटाना अपने आप पर AppDomains को हटाने का एक कारण नहीं होगा।
इयान ग्रिफिथ्स

5
मैं उलझन में हूं। .नेट कोर और सिल्वरलाइट के बीच क्या संबंध है?
svick

10
प्रोग्रामर यह मान लेते हैं कि .NETCore नया है। Microsoft इस धारणा को बहुत कम करता है, कम से कम 5.0 संस्करण संख्या को 1.0 में बदलकर नहीं। CoreCLR एक बहुत लंबे समय के लिए किया गया है, .NET कॉम्पैक्ट के लिए रनटाइम के रूप में जीवन शुरू किया। सिल्वरलाइट और WinRT / UWP रनटाइम इसके लिए उपयोग करने योग्य हैं, इससे पहले कि वे इसे खोल दें। चुनने के लिए सबसे अच्छा रनटाइम संस्करण, पहले से ही OSX और विभिन्न WinCE मोबाइल प्रोसेसर में पोर्ट किया गया है।
हंस पासेंट

46

.NET मानक 2 और .NET कोर 2 के लिए अद्यतन करें

.NET मानक 2 में AppDomainवर्ग है । हालाँकि, उस API के कई भाग एक PlatformNotSupportedException.NET कोर के लिए फेंक देंगे ।

मुख्य कारण यह अभी भी वहाँ है एक बुनियादी अपवाद हैंडलर को पंजीकृत करने जैसे बुनियादी सामान के लिए जो काम करेगा

.NET मानक FAQ में यह स्पष्टीकरण है :

क्या AppDomain .NET मानक का हिस्सा है?

AppDomain प्रकार .NET मानक का हिस्सा है। सभी प्लेटफ़ॉर्म नए ऐप डोमेन के निर्माण का समर्थन नहीं करेंगे, उदाहरण के लिए, .NET कोर नहीं होगा, इसलिए .NET मानक में उपलब्ध होने के दौरान AppDomain.CreateDomain विधि उपलब्ध नहीं होगी।

.NET मानक में हम इस प्रकार का खुलासा करते हैं, क्योंकि उपयोग काफी अधिक है और आमतौर पर नए ऐप डोमेन बनाने से जुड़ा नहीं है, लेकिन वर्तमान ऐप डोमेन के साथ बातचीत करने के लिए, जैसे कि एक अखंड अपवाद हैंडलर को पंजीकृत करना या एप्लिकेशन के आधार निर्देशिका के लिए पूछना ।

इसके अलावा, शीर्ष उत्तर और अन्य उत्तर भी स्पष्ट रूप से समझाते हैं कि क्यों AppDomain का थोक अभी भी काटा गया था (उदाहरण के लिए एक समर्थित अपवाद नहीं फेंकता है)।


20

अनुप्रयोग डोमेन

इसे बंद क्यों किया गया? AppDomains को रनटाइम समर्थन की आवश्यकता होती है और आम तौर पर काफी महंगे होते हैं। CoreCLR द्वारा अभी भी लागू किए जाने के बाद, यह .NET नेटिव में उपलब्ध नहीं है और हम इस क्षमता को वहां जोड़ने की योजना नहीं बनाते हैं।

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

MSDN ब्लॉग से स्रोत


एक प्रश्न, आपका क्या मतलब है For code isolation, we recommend processes and/or containers... .net कोर में एक कंटेनर एपीआई उपलब्ध है?
इवांड्रो जाओ

@IvandroIsmael, उनका अर्थ है "अपने एकल एप्लिकेशन / मॉड्यूल को अलग-अलग इंटरेस्टिंग ऐप्स / मॉड्यूल / प्रक्रिया / कंटेनर में विभाजित करें" (संभवत: - माइक्रोसर्विस में), यानी आपके ऐप को सत्यापन के लिए AppDomains का उपयोग नहीं करने के लिए खंडित करें
बर्स्ट

10

एक बिंदु पर, मैंने सुना है कि डोमेन का उपयोग किए बिना असेंबलिंग असेंबलियों को सक्षम किया जाएगा। मुझे लगता है कि System.Runtime.Loader.AssemblyLoadContextSystem.Runtime.Loader.dll का प्रकार इस कार्य से संबंधित है, लेकिन मुझे वहां कुछ भी नहीं दिखता है जो अभी तक लोड करने में सक्षम बनाता है।


5

मैंने कम्युनिटी स्टैंडअप या Microsoft की कुछ चर्चा में सुना है कि AppDomains की आइसोलेशन सुविधा को प्रक्रियाओं (और वास्तव में अन्य प्लेटफार्मों में सामान्य पैटर्न) द्वारा नियंत्रित किया जाता है और अनलोडिंग वास्तव में Appomomains से संबंधित एक सामान्य सुविधा के रूप में योजनाबद्ध है।


5

आपको अब AppDomains की आवश्यकता नहीं है, अब आपके पास LoadContexts है:

public class CollectibleAssemblyLoadContext 
    : AssemblyLoadContext
{
    public CollectibleAssemblyLoadContext() : base(isCollectible: true)
    { }
 
    protected override Assembly Load(AssemblyName assemblyName)
    {
        return null;
    }
}

byte[] result = null; // Assembly Emit-result from roslyn
System.Runtime.Loader.AssemblyLoadContext context = new CollectibleAssemblyLoadContext();
System.IO.Stream ms = new System.IO.MemoryStream(result);
System.Reflection.Assembly assembly = context.LoadFromStream(ms);


System.Type programType = assembly.GetType("RsEval");
MyAbstractClass eval = (MyAbstractClass )System.Activator.CreateInstance(programType);
eval.LoadContext = context;
eval.Stream = ms;
// do something here with the dynamically created class "eval"

और फिर आप कह सकते हैं

eval.LoadContext.Unload();
eval.Stream.Dispose();

बोनस यदि आप अमूर्त वर्ग के आईडीआईसोफ़ेयर इंटरफ़ेस में डालते हैं, तो आप बस उपयोग कर सकते हैं, यदि आप चाहते हैं।

नोट:
यह एक आम सभा में एक निश्चित अमूर्त वर्ग को मानता है

public abstract class MyAbstractClass 
{

     public virtual void foo()
     {}
}

और एक गतिशील क्रम-जनित वर्ग (रोसलिन का उपयोग करके), आम सभा में सार वर्ग को संदर्भित करता है, जो लागू होता है:

public class RsEval: MyAbstractClass 
{

     public override void foo()
     {}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.