2009-07-14 11 views
5

हमारे पास सी # 3.5 (एसपी 1) में WinForms एप्लिकेशन है। हम एप्लिकेशन को एकाधिक विंडो उदाहरणों के साथ स्मृति में एक प्रक्रिया में प्रतिबंधित करना चाहते हैं। हम एक एमडीआई दृष्टिकोण की तलाश नहीं कर रहे हैं, लेकिन कई आवेदन प्रक्रियाओं को लॉन्च किए बिना अलग मुख्य रूप उदाहरण हैं।एकाधिक उदाहरणों के साथ WinForm एप्लिकेशन को एक प्रक्रिया में प्रतिबंधित करना

हम तीन तरीकों का मूल्यांकन कर रहे:

  1. विंडोज संदेश
  2. कॉम
  3. WCF

हम विंडोज संदेश और अधिभावी winproc के साथ पहली बार 2 (PInvoke के लिए किसी न किसी तरह विवरणों की COM रजिस्ट्री, आदि) और वे पुरानी प्रौद्योगिकियों का उपयोग करते हैं।

हमने डब्ल्यूसीएफ का उपयोग नामित पाइप के साथ करने के विचार पर चर्चा की और लगता है कि यह कार्य को पूरा करने के लिए सबसे साफ और आसान तरीका हो सकता है।

एकाधिक मुख्य रूप उदाहरणों के साथ एक प्रक्रिया में एप्लिकेशन को प्रतिबंधित करने का सबसे साफ, आधुनिक तरीका क्या है?

+0

कॉम, WCF क्या कर में अंतर-मशीन संचार करने के लिए आधुनिक तरीका है के लिए और विंडोज संदेशों को इसके साथ क्या करना है? –

+0

किसी ने रजिस्ट्री में COM के साथ पहला एप्लिकेशन पंजीकृत करने और फिर यह पूछताछ की कि जब एप्लिकेशन मौजूदा ऐप पर कॉल करने के लिए लोड हो जाता है। दूसरा विचार संवाद का उदाहरण बनाने के लिए WinProc और PInvoke को WM_COMMAND ओवरलोड करना था। डब्ल्यूसीएफ हमारे लिए एक नामित पाइप तैयार करेगा। कम से कम यही है जो वहां फेंक दिया गया था। – blu

+0

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

उत्तर

3

अतीत में नियोजित तरीकों में से एक प्रणाली mutex ऑब्जेक्ट का उपयोग करना था। इसके पीछे सिद्धांत यह है कि एप्लिकेशन का पहला उदाहरण म्यूटेक्स ऑब्जेक्ट और एप्लिकेशन के बाद के उदाहरण उत्पन्न करेगा, फिर पूर्वनिर्धारित म्यूटेक्स को हैंडल खोलने का प्रयास करेगा और यदि यह मौजूद है, तो बामो! दूसरे और तीसरे और चौथे से बाहर निकलें .... उदाहरण।

public static void CheckSingleInstance() 
{ 
    bool created = false; 
    _singleInstance = new Mutex(true, "PredefinedMutexName##1", out created); 

    if (!created) 
    { 
     MessageBox.Show("Another instance of this application is already running. Click OK to switch to that instance.", "Application running", MessageBoxButtons.OK, MessageBoxIcon.Information); 

     Process proc = Process.GetCurrentProcess(); 
     Process[] procs = Process.GetProcessesByName(proc.ProcessName); 
     bool exit = false; 
     Process process = null; 
     foreach (Process p in procs) 
     { 
      if (p.Id != proc.Id && p.MainModule.FileName == proc.MainModule.FileName) 
      { 
       // ShowWindow(p.MainWindowHandle, 1/*SW_SHOWNORMAL*/); 
       process = p; 
       exit = true; 
      } 
     } 
     if (exit) 
     { 
      Application.Exit(); 

      if (process != null) 
       NativeMethods.SetForegroundWindow(process.MainWindowHandle); 

      return; 
     } 
    } 
} 
1

प्रश्न बहुत स्पष्ट नहीं है। मैं समझता हूं कि आप पहले से ही जानते हैं कि अपने एप्लिकेशन को केवल एक उदाहरण तक सीमित कैसे करें, और आप अपने मुख्य फॉर्म के कई उदाहरण स्वतंत्र रूप से निष्पादित करना चाहते हैं लेकिन उसी प्रक्रिया के अंदर, सही? और फिर आप उन्हें संवाद करने का सबसे अच्छा तरीका ढूंढ रहे हैं?

ऐसा करने के लिए मैं आपकी प्रक्रिया में कई Application Domains बनाउंगा। इस तरह आप प्रत्येक फॉर्म को अलग कर सकते हैं जैसे कि यह अपनी प्रक्रिया में चल रहा था। वे अलग-अलग पता रिक्त स्थान का उपयोग करेंगे, स्वतंत्र रूप से रोका जा सकता है और एक डोमेन में कोड अन्य डोमेन (दोष, आदि) में कोड को प्रभावित नहीं कर सकता है।

विभिन्न रूपों/आवेदन डोमेन के बीच संचार मैं WCF का प्रयोग करेंगे के रूप में यह अंतर-प्रक्रिया या अंतर-आवेदन या .NET फ्रेमवर्क

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