Получить текущее имя издателя приложения ClickOnce? - PullRequest
7 голосов
/ 10 января 2012

Можно ли прочитать имя издателя запущенного в данный момент приложения ClickOnce (которое вы установили на Project Properties -> Publish -> Options -> Publisher name в Visual Studio)?

Причина, по которой мне это нужно, состоит в том, чтобы запустить другой экземпляр запущенного в данный момент приложения, как описано в этой статье , и передать ему параметры.

Конечно, я делаю знаю имя издателя моего приложения, но если я жестко закодирую его и позже решу изменить имя своего издателя, я, скорее всего, забуду обновить этот фрагмент кода.

Ответы [ 3 ]

5 голосов
/ 11 января 2012

Вот еще один вариант.Обратите внимание, что он получит только имя издателя для текущего запущенного приложения, и это все, что мне нужно.

Я не уверен, что это самый безопасный способ разбора 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;
}
1 голос
/ 11 января 2012

Вы могли бы подумать, что это будет тривиально, но я не вижу ничего в структуре, которая дает вам эту информацию.

Если вы хотите взломать, вы можете получить издателя из реестра.

Отказ от ответственности - Код уродлив и непроверен ...

    ...
    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 голосов
/ 11 января 2012

Я не знаю о 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;
        }
    }

К сожалению, пользовательского атрибута "издатель" нет, просто выбрасываем его как возможный обходной путь

...