2010-06-18 16 views
6

मैं वर्तमान में .NET में एक आंतरिक अनुप्रयोग बनाए रखता हूं। एप्लिकेशन एक समय में एक चल रहे सत्र को बनाए रखने के लिए आईपीसी का उपयोग करता है; यदि कोई अन्य सत्र खोलने का प्रयास करता है (कोई आइकन फिर से क्लिक करता है, तो कुछ सहेजे गए परिणाम फ़ाइल को खोलता है), दूसरा सत्र इसे पहले सत्र में संचारित करता है और फिर पहले सत्र के साथ अनुरोधित कार्रवाई को लॉन्च करता है।स्थानीय व्यवस्थापक होने के बिना आईपीसी का उपयोग कैसे करें?

मैं वर्तमान में उपयोग कर ऐसा करने System.ServiceModel नाम स्थान है, तो जैसे:

नाम स्थान EventLogViewer.IPCServer { // आम ढांचे प्रक्रियाओं oneanother को संवाद करने के लिए प्रदान करता है।

[ServiceContract(Namespace = "http://ELV.domain")] 
interface IELVLauncher 
{ 
    [OperationContract] 
    bool LaunchTabs(String[] fileNames); 
} 
public delegate void TabLauncher(String[] fileNames); 
class ELVLauncherServer : IDisposable 
{ 
    ServiceHost ipcService; 
    public ELVLauncherServer() 
    { 
     Uri baseAddress = new Uri("Http://localhost:45600/elvlauncher/service"); 
     String address = "net.pipe://localhost/elvlauncher/tablauncher"; 

     ipcService = new ServiceHost(typeof(ELVLauncher), baseAddress); 

     NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None); 
     ipcService.AddServiceEndpoint(typeof(IELVLauncher), binding, address); 

     ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); 
     behavior.HttpGetEnabled = true; 
     behavior.HttpGetUrl = new Uri("http://localhost:45601/elvlauncher"); 
     ipcService.Description.Behaviors.Add(behavior); 
     Utilities.WriteMemoryDebugStatement(new DebugStatement(DebugStatement.StatementType.INFO, "Registering IPC Service")); 
     ipcService.Open(); 

    } 

    #region IDisposable Members 

    public void Dispose() 
    { 
     ipcService.Close(); 
    } 

    #endregion 
} 
public class ELVLauncher : IELVLauncher 
{ 
    #region IELVLauncher Members 

    public bool LaunchTabs(string[] fileNames) 
    { 
     try 
     { 
      Utilities.WriteMemoryDebugStatement(new DebugStatement(DebugStatement.StatementType.INFO, String.Format("IPC request received, files: {0}", String.Join(", ", fileNames)))); 
      Program.mainWindow.backgroundListener_OnLaunchRequestReceived(fileNames); 
     } 
     catch (Exception exception) 
     { 
      Utilities.WriteMemoryDebugStatement(new DebugStatement(exception)); 
     } 
     return (true); 
    } 

    #endregion 

} 

यह कोड मूल रूप से विंडोज एक्सपी के तहत विकसित किया गया था, जैसा कि अधिकांश निगमों को हम Vista में नहीं गए थे। चूंकि हम सभी स्थानीय प्रशासकों के रूप में दौड़ते हैं, इसलिए यह कोड बिना किसी समस्या के भाग गया।

हालांकि, हम अब विन 7 में संक्रमण कर रहे हैं, और यह कोड स्टार्टअप पर अपवाद उत्पन्न करता है क्योंकि यह आईपीसी एंडपॉइंट पंजीकृत नहीं कर सकता है। अधिक जानकारी यहां है: http://mark.michaelis.net/Blog/WindowsCommunicationFoundationWithWindowsVistaAndUAC.aspx

दिए गए कार्यवाही को व्यवस्थापक निजीकरण की आवश्यकता के लिए ऐप को अपनाना है। यह दो कारणों से काम नहीं करता है:

  1. इस एप्लिकेशन को व्यवस्थापक privledges की जरूरत नहीं है अन्यथा
  2. हमने अपने आंतरिक उपकरणों की तैनाती के लिए ClickOnce का उपयोग करें और ClickOnce प्रक्रिया लांचर के रूप में चल के अलावा और कुछ का समर्थन नहीं करता।

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

+1

शीर्षक में ".NET 3.5 C#:" टैग दोहराएं। –

उत्तर

3

यह आपके ऐप के एक सत्र को सुनिश्चित करने के लिए एक अविश्वसनीय रूप से कठिन (और जैसा कि आपने पाया है, समस्याग्रस्त तरीका) है। आपको सुविधा को use a mutex पर रीफैक्टर/दोबारा करना चाहिए।

यहां एक और example. और अपेक्षित wiki article about mutexes है।

संपादित

(अपने विशेष उपसर्ग के लिए फ़िल्टरिंग संचार बिट आप अपने खुद के विशेष उपसर्ग और या ओएस-प्रदान की अस्थायी फ़ोल्डर जो एक अनुप्रयोग मतदान होगा में विस्तार के साथ एक अस्थायी फ़ाइल उत्पन्न कर सकता है चारों ओर पाने के लिए और/या एक्सटेंशन) यह देखने के लिए कि क्या अधिक अनुरोध किए गए थे। देखें:

System.IO.Path.GetTempFileName 

और

System.IO.Path.GetTempPath 
+0

बोनस: व्यवस्थापक म्यूचुअल के बिना एक म्यूटेक्स बनाया जा सकता है। – Cheeso

+0

@ चेसियो: बिल्कुल।मुझे लगता है कि मुझे जवाब में इसके बारे में स्पष्ट होना चाहिए। –

+0

धन्यवाद, लेकिन यह केवल आधा समस्या हल करता है। दूसरी प्रक्रिया को पहले यह बताना होगा कि यह क्या करने जा रहा है (लॉन्च करें, एक सहेजी गई रिपोर्ट लोड करें)। म्यूटेक्स इसके लिए अनुमति नहीं देते हैं। – Dan

2

निश्चित रूप से एक उदाहरण के लिए आवेदन सीमित करने के लिए एक named mutex उपयोग करते हैं, तो आप NamedPipeServerStream और NamedPipeClientStream उपयोग कर सकते हैं अपने आईपीसी जो व्यवस्थापक अधिकार की आवश्यकता नहीं होगी करने के लिए।

+0

धन्यवाद, ऐसा लगता है कि मैं जिस मार्ग पर जाऊंगा। – Dan

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