2010-04-15 23 views
17

मुझे .NET रनटाइम के default behavior में किसी बग के आसपास काम करने के लिए एक कस्टम एप्लिकेशन डोमेन बनाने की आवश्यकता है। ऑनलाइन देखा गया नमूना कोड में से कोई भी सहायक नहीं है क्योंकि मुझे नहीं पता कि इसे कहां रखा जाए, या मुझे Main() विधि में बदलने की आवश्यकता है।मैं एक एप्लिकेशन डोमेन कैसे बना सकता हूं और इसमें अपना एप्लिकेशन चला सकता हूं?

1) AppDomainSetup वस्तु का एक उदाहरण बना सकते हैं और AppDomain.CreateDoman विधि का उपयोग कर सेटअप जानकारी आपके डोमेन

2) अपने नए डोमेन बनाएँ के लिए आप चाहते हैं से पॉप्युलेट:

उत्तर

35

जरूरत की बहुत विस्तृत उदाहरण है कि AppDomains बनाने बस कुछ एक निरंतर तार के साथ ठीक किया जा सकता है कि चारों ओर पाने के लिए शायद यह करने के लिए गलत तरीका है । एक nonstatic माध्यमिक का उपयोग कर ओ)

static void Main(string[] args) 
{ 
    if (AppDomain.CurrentDomain.IsDefaultAppDomain()) 
    { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 

     var currentAssembly = Assembly.GetExecutingAssembly(); 
     var otherDomain = AppDomain.CreateDomain("other domain"); 
     var ret = otherDomain.ExecuteAssemblyByName(currentAssembly.FullName, args); 

     Environment.ExitCode = ret; 
     return; 
    } 

    Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
    Console.WriteLine("Hello"); 
} 

त्वरित नमूना: यदि आप लिंक आप उल्लेख किया है एक ही बात करने के लिए कोशिश कर रहे हैं, तो आप सिर्फ ऐसा कर सकता है:

var configFile = Assembly.GetExecutingAssembly().Location + ".config"; 
if (!File.Exists(configFile)) 
    throw new Exception("do your worst!"); 

रिकर्सिव प्रवेश बिंदु प्रवेश बिंदु और MarshalByRefObject ...

class Program 
{ 
    static AppDomain otherDomain; 

    static void Main(string[] args) 
    { 
     otherDomain = AppDomain.CreateDomain("other domain"); 

     var otherType = typeof(OtherProgram); 
     var obj = otherDomain.CreateInstanceAndUnwrap(
           otherType.Assembly.FullName, 
           otherType.FullName) as OtherProgram; 

     args = new[] { "hello", "world" }; 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
     obj.Main(args); 
    } 
} 

public class OtherProgram : MarshalByRefObject 
{ 
    public void Main(string[] args) 
    { 
     Console.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
     foreach (var item in args) 
      Console.WriteLine(item); 
    } 
} 
+1

धन्यवाद। क्या दूसरे के लिए एक दृष्टिकोण पसंद करने का कोई कारण है? –

+0

पहला शायद क्लीनर होगा। यह आपको उस ऑब्जेक्ट को बनाने के बजाय मानक प्रविष्टि बिंदु का उपयोग करने की अनुमति देगा जिसे एपडोमेन में मार्शल करने की आवश्यकता होगी। दूसरा दृष्टिकोण अधिक विशिष्ट है।लेकिन यह आमतौर पर प्लग-इन के लिए उपयोग किया जाता है, न कि ऐप का मुख्य प्रवेश बिंदु। –

+1

'AppDomain' ऑब्जेक्ट पर 'executeAssembly (...)' विधि भी है जिसे आप एक प्रविष्टि बिंदु वाले किसी अन्य असेंबली के पथ प्रदान कर सकते हैं। यह थोड़ा क्लीनर डिज़ाइन की अनुमति दे सकता है, लेकिन कम से कम दो असेंबली की आवश्यकता होगी। रिकर्सन के लिए –

4

आप की जरूरत है। कॉन्फ़िगरेशन पैरामीटर के साथ AppDomainSetup उदाहरण CreateDomain विधि को पास किया गया है।

3) डोमेन ऑब्जेक्ट पर CreateInstanceAndUnwrap विधि का उपयोग कर नए डोमेन में अपनी ऑब्जेक्ट का एक उदाहरण बनाएं। यह विधि उस ऑब्जेक्ट का टाइपनाम लेती है जिसे आप बनाना चाहते हैं और एक नया रिमोटिंग प्रॉक्सी देता है जिसे आप नए मुख्य डोमेन में उपयोग कर सकते हैं ताकि नए

में बनाए गए ऑब्जेक्ट के साथ संवाद करने के लिए आप इन 3 चरणों के साथ हो जाएं तो आप विधियों को कॉल कर सकते हैं प्रॉक्सी के माध्यम से अन्य डोमेन। आपके द्वारा किए जाने के बाद भी डोमेन को अनलोड कर सकते हैं और इसे फिर से लोड कर सकते हैं। यह शायद ध्यान दिया जाना चाहिए

MSDN मदद में यह topic क्या आप

+2

कि कम या ज्यादा क्या मैं उदाहरण मैं कहीं और देखा में देखा है है, लेकिन मुझे अभी भी कोई भी जानकारी उपलब्ध नहीं है जो मुझे अभी भी कम है। क्या मैं सिर्फ एप्लिकेशन को कॉल करता हूं। रुन (नया माईफॉर्म)? क्या मैं अपने मुख्य विधि से सभी मौजूदा स्टार्टअप कोड को काटता हूं, इसे एक नई विधि में डाल देता हूं, और इसे अपना ऐप शुरू करने के लिए कहता हूं? उपरोक्त में से कोई भी नहीं क्योंकि मुझे लगता है कि मैं भी ज्यादा उलझन में हूं? –

+1

जिस ऑब्जेक्ट को आप प्रॉक्सी प्राप्त करने का प्रयास कर रहे हैं वह 'मार्शलबीरफॉब्जेक्ट' होना चाहिए या अन्यथा यह प्रतिलिपि को मूल ऐपडोमेन में क्रमबद्ध करने का प्रयास करेगा। –

+0

@ मैथ्यू व्हिटेड - आप सही हैं, मैं उल्लेख कर रहा हूं कि – mfeingold

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

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