Определить текущую версию пакета VSIX из кода

Я пишу проект VSIX и хочу, чтобы код мог определить, доступно ли обновление.

Я знаю, что Visual Studio сможет проверить наличие обновления, однако я хотел бы, чтобы расширение могло более подробно подсказывать пользователю (разработчику).

  1. Интересно, как заставить расширение читать свою версию из манифеста пакета?

Спасибо.


person Nordin    schedule 26.03.2014    source источник
comment
Нельзя ли просто вытащить информацию о версии из непосредственной сборки?   -  person Lloyd    schedule 26.03.2014
comment
@Ллойд, спасибо за ответ. Информация о версии непосредственной сборки не синхронизируется с информацией о версии vsix. Поддерживать синхронизацию тоже может быть хорошей идеей. Спасибо.   -  person Nordin    schedule 26.03.2014
comment
Power Tools для Visual Studio 2010 предоставляют уведомления о обновления расширения. Это стало стандартная функция, начиная с Visual Studio 2012. Не реализуйте эту функцию нестандартным образом; скорее, сообщите своим пользователям о существующей функции.   -  person Sam Harwell    schedule 26.03.2014
comment
@ 280Z28, спасибо за отзыв и совет. Как указано выше, я полностью осведомлен о стандартном уведомлении Visual Studio. Независимо от этого (повторно реализовать это или нет), мой вопрос остается в силе.   -  person Nordin    schedule 26.03.2014
comment
Теперь, как мы можем получить текущую версию расширения в Visual Studio Gallery для сравнения с локальной версией?   -  person A-Sharabiani    schedule 08.07.2015


Ответы (2)


Я обнаружил, что могу считывать информацию о версии непосредственно из XML-файла манифеста.

        var doc = new XmlDocument();
        doc.Load(manifestPath);
        var metaData = doc.DocumentElement.ChildNodes.Cast<XmlElement>().First(x => x.Name == "Metadata");
        var identity = metaData.ChildNodes.Cast<XmlElement>().First(x => x.Name == "Identity");
        var version = identity.GetAttribute("Version");

Я также написал gist код класса C#, который инкапсулирует приведенный выше код. Кроме версии, этот метод можно использовать для получения другой информации, предоставляемой файлом манифеста.

person Nordin    schedule 18.04.2014
comment
Спасибо, чувак, просто пытался найти решение и этого вопроса. Вы сэкономили мне много времени - person Artiom; 22.04.2014
comment
@AliSharabiani Возможно, вы захотите просмотреть суть, которую я изложил в ответе выше. Это должно быть (по крайней мере, в моем случае) примерно так: Path.Combine(assemblyDirectory, extension.vsixmanifest) - person Nordin; 08.07.2015
comment
@Nordin Я пробовал это, это то же самое, что использовать этот код: manifestPath = "extension.vsixmanifest" (пути относительные в vspackage, поэтому это также работает). Однако он работает локально при развертывании пакета в Visual Studio Gallery и его установке; путь неверный Could not find file C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\extension.vsixmanifest. - person A-Sharabiani; 08.07.2015

Решение Nordin кажется хорошим, но я просто хочу отметить, что есть еще один способ получить текущую версию расширения. Я понятия не имею, в какой ситуации мое решение может быть лучше, может быть, если вы не знаете путь к манифесту на клиенте, который использует это расширение.

// get ExtensionManager
IVsExtensionManager manager = GetService(typeof(SVsExtensionManager)) as IVsExtensionManager;
// get your extension by Product Id
IInstalledExtension myExtension = manager.GetInstalledExtension("ProductId-1234-1234-1234-123456789012");
// get current version
Version currentVersion = myExtension.Header.Version;

Я вызываю это внутри метода Initialize() моего пакета.

person Дмитро Кононенко    schedule 05.05.2014
comment
Спасибо, попробую это решение. - person Nordin; 06.05.2014
comment
Одна вещь отсутствует, dll для этого не отображается как ссылка для добавления, вам нужно добавить ее через обзор из следующего места - C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.ExtensionManager\{ ваша версия, которую вы хотите использовать}\Microsoft.VisualStudio.ExtensionManager.dll - person Stephen; 01.05.2015
comment
Работает как чемпион! Спасибо! Протестировано как на экспериментальном экземпляре Visual Studio, так и после развертывания пакета. - person A-Sharabiani; 08.07.2015
comment
Это решение не включает вызовы файловой системы, что в некоторых случаях лучше. Вы просто берете значение из памяти. - person itaiy; 14.06.2021