2012-01-10 23 views
7

Có thể đọc tên nhà xuất bản của ứng dụng ClickOnce hiện đang chạy (ứng dụng bạn đặt ở số Project Properties -> Publish -> Options -> Publisher name trong Visual Studio) không?Nhận tên nhà xuất bản ứng dụng của ClickOnce hiện tại?

Lý do tại sao tôi cần nó là chạy một phiên bản khác của ứng dụng hiện đang chạy như được mô tả trong this bài viết và truyền tham số cho nó.

Tất nhiên tôi làm biết tên nhà xuất bản của ứng dụng, nhưng nếu tôi viết mã và sau này tôi quyết định thay đổi tên nhà xuất bản của mình, rất có thể tôi sẽ quên cập nhật đoạn mã này.

+0

Về cách khởi chạy ứng dụng ClickOnce khác, tôi sẽ sử dụng cố gắng sử dụng URL kích hoạt với tham số chuỗi truy vấn để thay thế nếu có thể trong môi trường của bạn (cần triển khai tới máy chủ web). Theo http://stackoverflow.com/questions/7588608/clickonce-application-wont-accept-command-line-arguments/7588781#7588781 – Reddog

+0

Tôi không chắc liệu điều này có áp dụng cho trường hợp của tôi hay không. Điều này cài đặt từ một máy chủ, nhưng không "chạy" từ một máy chủ theo như tôi biết. Tôi có nghĩa là bạn có thể chạy nó ngoại tuyến quá sau khi cài đặt. Bạn chỉ cần chuyển URL đó đến 'Process.Start'? – Juan

Trả lời

1

Bạn sẽ nghĩ điều này là tầm thường, nhưng tôi không thấy bất kỳ điều gì trong khung cung cấp cho bạn thông tin này.

Nếu bạn muốn có bản hack, bạn có thể yêu cầu nhà xuất bản đăng ký.

Disclaimer - Mã là xấu xí và chưa được kiểm tra ...

... 
    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(); 
     } 
    } 

Nếu bạn tìm thấy một giải pháp tốt hơn, hãy làm theo-up.

0

Tôi không biết về ClickOnce, nhưng bình thường, bạn có thể đọc lắp ráp-info sử dụng khuôn khổ System.Reflection:

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

Thật không may, theres không có "nhà xuất bản" tùy chỉnh thuộc tính, chỉ cần ném này ra như một công việc có thể xung quanh

4

Đây là một tùy chọn khác. Lưu ý rằng nó sẽ chỉ nhận được tên nhà xuất bản cho ứng dụng hiện đang chạy, đó là tất cả những gì tôi cần.

Tôi không chắc đây có phải là cách an toàn nhất để phân tích cú pháp XML hay không.

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; 
} 
Các vấn đề liên quan