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


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

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

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

Спасибо.

2 2

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# class code, который инкапсулирует приведенный выше код. Кроме того, версия, этот метод может быть использован для получения другой информации, предоставляемой файлом манифеста.

Решение 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() моего пакета.