2012-01-10 21 views
7

क्या वर्तमान में चल रहे क्लिकऑन एप्लिकेशन के प्रकाशक नाम को पढ़ना संभव है (जिसे आपने विजुअल स्टूडियो में Project Properties -> Publish -> Options -> Publisher name पर सेट किया है)?वर्तमान क्लिकऑन के एप्लिकेशन प्रकाशक का नाम प्राप्त करें?

मुझे इसकी आवश्यकता क्यों है वर्तमान में चल रहे एप्लिकेशन का एक और उदाहरण चलाने के लिए this आलेख में वर्णित करें और इसके लिए पैरामीटर पास करें।

बेशक मैं जानता हूं कि मेरे एप्लिकेशन के प्रकाशक का नाम है, लेकिन यदि मैं इसे हार्ड कोड करता हूं और बाद में मैं अपने प्रकाशक के नाम को बदलने का फैसला करता हूं तो मैं कोड के इस टुकड़े को अपडेट करना भूल सकता हूं।

+0

मैं सक्रियण यूआरएल उपयोग करने के लिए क्वेरी स्ट्रिंग के बजाय यदि आपके वातावरण में संभव मानकों के साथ की कोशिश का प्रयोग करेंगे ClickOnce अनुप्रयोग के अपने अन्य उदाहरण शुरू करने के मामले में (एक वेब सर्वर पर तैनात करने के लिए की जरूरत है)। Http://stackoverflow.com/questions/7588608/clickonce-plplication-wont-accept-command-line-arguments/7588781#7588781 – Reddog

+0

के अनुसार मुझे यकीन नहीं है कि यह मेरे मामले पर लागू होता है या नहीं। यह एक सर्वर से स्थापित करता है, लेकिन जहां तक ​​मुझे पता है सर्वर से "रन" नहीं करता है। मेरा मतलब है कि आप इसे स्थापित करने के बाद भी ऑफ़लाइन चला सकते हैं। क्या आप बस उस यूआरएल को 'Process.Start' पर पास करना चाहते हैं? – Juan

उत्तर

1

आपको लगता है कि यह छोटा होगा, लेकिन मुझे ढांचे में कुछ भी दिखाई नहीं देता जो आपको यह जानकारी देता है।

यदि आप एक हैक चाहते हैं, तो आप प्रकाशक को रजिस्ट्री से प्राप्त कर सकते हैं।

अस्वीकरण - कोड बदसूरत और untested है ...

... 
    var publisher = GetPublisher("My App Name"); 
    ... 

    public static string GetPublisher(string application) 
    { 
     using (var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall")) 
     { 
      var appKey = key.GetSubKeyNames().FirstOrDefault(x => GetValue(key, x, "DisplayName") == application); 
      if (appKey == null) { return null; } 
      return GetValue(key, appKey, "Publisher"); 
     } 
    } 

    private static string GetValue(RegistryKey key, string app, string value) 
    { 
     using (var subKey = key.OpenSubKey(app)) 
     { 
      if (!subKey.GetValueNames().Contains(value)) { return null; } 
      return subKey.GetValue(value).ToString(); 
     } 
    } 

आप एक बेहतर समाधान मिल जाए, अनुवर्ती करें।

0

मैं ClickOnce के बारे में पता नहीं है, लेकिन आम तौर पर, आप विधानसभा-जानकारी System.Reflection ढांचे का उपयोग कर पढ़ सकते हैं:

public string AssemblyCompany 
    { 
     get 
     { 
      object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); 
      if (attributes.Length == 0) 
      { 
       return ""; 
      } 
      return ((AssemblyCompanyAttribute)attributes[0]).Company; 
     } 
    } 

दुर्भाग्य से, नहीं "प्रकाशक" कस्टम विशेषता theres, बस के रूप में यह बाहर फेंक एक संभावित काम-आसपास

4

यहां एक और विकल्प है। ध्यान दें कि इसे वर्तमान में चल रहे एप्लिकेशन के लिए केवल प्रकाशक नाम मिलेगा, जो मुझे चाहिए।

मुझे यकीन नहीं है कि यह XML को पार्स करने का सबसे सुरक्षित तरीका है या नहीं।

public static string GetPublisher() 
{ 
    XDocument xDocument; 
    using (MemoryStream memoryStream = new MemoryStream(AppDomain.CurrentDomain.ActivationContext.DeploymentManifestBytes)) 
    using (XmlTextReader xmlTextReader = new XmlTextReader(memoryStream)) 
    { 
     xDocument = XDocument.Load(xmlTextReader); 
    } 
    var description = xDocument.Root.Elements().Where(e => e.Name.LocalName == "description").First(); 
    var publisher = description.Attributes().Where(a => a.Name.LocalName == "publisher").First(); 
    return publisher.Value; 
} 
संबंधित मुद्दे