从代码中检测当前VSIX包的版本

本文关键字:VSIX 版本 代码 检测 | 更新日期: 2023-09-27 17:53:31

我正在编写一个VSIX项目,我希望代码能够确定是否有更新可用。

我知道Visual Studio将能够检查更新,但是,我希望扩展能够更详细地提示用户(开发人员)。

  1. 我想知道如何使扩展从包清单中读取自己的版本?

谢谢。

从代码中检测当前VSIX包的版本

我发现我可以直接从manifest 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");

我还编写了一个要点c#类代码来封装上面的代码。此外,该技术还可用于获取清单文件提供的其他信息。

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()方法中调用这个

这段由Wayne Koorts编写的代码对我来说是有效的,即使是在Visual Studio Gallery上部署包:

    private string getVsixVersion()
    {
        var asm = Assembly.GetExecutingAssembly();
        var asmDir = Path.GetDirectoryName(asm.Location);
        var manifestPath = Path.Combine(asmDir, "extension.vsixmanifest");
        var version = "?";
        if (File.Exists(manifestPath))
        {
            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");
            version = identity.GetAttribute("Version");
        }
        return version;
    }