编程语言
首页 > 编程语言> > C#-自动更新Visual Studio扩展

C#-自动更新Visual Studio扩展

作者:互联网

我试图使扩展程序在将新版本推送到Visual Studio Gallery时自动进行自我更新.关于如何实现这一目标,有一些指南,但它们已有两年历史,可能并不适用.

对于初学者,我尝试按以下方式查询IVsExtensionRepository

var _extensionRepository = (IVsExtensionRepository)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsExtensionRepository));

var query = _extensionRepository.CreateQuery<VSGalleryEntry>(false, true)
                .OrderByDescending(n => n.Ranking)
                .Skip(0)
                .Take(25) as IVsExtensionRepositoryQuery<VSGalleryEntry>;

query.ExecuteCompleted += Query_ExecuteCompleted;
query.ExecuteAsync();

在Query_ExecuteCompleted处,我从服务器接收到异常:“远程服务器返回错误:(400)错误的请求.”

提供了堆栈跟踪:

服务器堆栈跟踪:
    在System.Runtime.AsyncResult.End [TAsyncResult](IAsyncResult结果)处
    在System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End(SendAsyncResult结果)
    在System.ServiceModel.Channels.ServiceChannel.EndCall处(字符串操作,Object []输出,IAsyncResult结果)
    在System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage methodCall,ProxyOperationRuntime操作)
    在System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage消息)

该服务托管于:https://visualstudiogallery.msdn.microsoft.com/services/dev12/extension.svc

有谁知道我如何创建一个Visual Studio扩展,该扩展会自动从Visual Studio画廊自动更新?通过IVsExtensionRepository还是手动进行?

解决方法:

编辑:现在,在Visual Studio 2015中,扩展会自动下载.

因此,我已经完全放弃了查询IVsExtensionRepository.我不确定为什么,但是它构造的查询一定存在一些内部问题.我使用ErikEJ的建议项目查询了相同的服务,并且运行良好.

但是,我不想从WSDL构造服务,因为SQLCeToolbox看起来已经完成了.相反,我使用了IVsExtensionRepository,但是避免了CreateQuery()方法.

附件是我更新VSPackage的方法.您需要用软件包的信息替换任何GUID或软件包的特定名称.

注意以下代码中有一个“陷阱”:

请注意,CodeConnectRepositoryEntry仅实现DownloadUrl.更新VSPackage时,这是所有人必须担心的,因为它允许我们下载新的软件包.可以在VSPackage的VSGallery页面上找到此URL.

但是:您必须按如下所示修剪URL:

http://visualstudiogallery.msdn.microsoft.com/c0c2ad47-957c-4e07-89fc-20996595b6dd/file/140793/4/CodeConnectAlpha.vsix

至:

http://visualstudiogallery.msdn.microsoft.com/c0c2ad47-957c-4e07-89fc-20996595b6dd/file/140793/

上面的/ 4 /代表第四次上传.通过完全删除它,Visual Studio Gallery将下载最新版本.

internal class CodeConnectUpdater
{
    IVsExtensionManager _extensionManager;

    IVsExtensionRepository _extensionRepository;

    //We need only supply the download URL.
    //This can be retrieved from the "Download" button on your extension's page.
    private class CodeConnectRepositoryEntry : IRepositoryEntry
    {
        public string DownloadUpdateUrl
        {
            get; set;
        }

        public string DownloadUrl
        {
            get
            {
                //NOTE: YOU MUST TRIM THE DOWNLOAD URL
                //TO NOT CONTAIN A VERSION. THIS FORCES 
                //THE GALLERY TO DOWNLOAD THE LATEST VERSION
                return "http://visualstudiogallery.msdn.microsoft.com/c0c2ad47-957c-4e07-89fc-20996595b6dd/file/140793/";
            }
            set
            {
                throw new NotImplementedException("Don't overwrite this.");
            }
        }

        public string VsixReferences
        {
            get; set;
        }
    }

    //I have been calling this from the VSPackage's Initilize, passing in the component model
    public bool CheckForUpdates(IComponentModel componentModel)
    {
        _extensionRepository = (IVsExtensionRepository)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsExtensionRepository));
        _extensionManager = (IVsExtensionManager)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsExtensionManager));
        //Find the extension you're after.
        var extension = _extensionManager.GetInstalledExtensions().Where(n => n.Header.Name == "Code Connect Alpha").SingleOrDefault();

        return CheckAndInstallNewVersion(extension);
    }

    private bool CheckAndInstallNewVersion(IInstalledExtension myExtension)
    {
        var needsRestart = false;
        var entry = new CodeConnectRepositoryEntry();
        var newVersion = FetchIfUpdated(myExtension, entry);
        if (newVersion != null)
        {
            Install(myExtension, newVersion);
            needsRestart = true;
        }

        return needsRestart;
    }

    //Checks the version of the extension on the VS Gallery and downloads it if necessary.
    private IInstallableExtension FetchIfUpdated(IInstalledExtension extension, CodeConnectRepositoryEntry entry)
    {
        var version = extension.Header.Version;
        var strNewVersion = _extensionRepository.GetCurrentExtensionVersions("ExtensionManagerQuery", new List<string>() { "6767f237-b6e4-4d95-9982-c9e898f72502" }, 1033).Single();
        var newVersion = Version.Parse(strNewVersion);

        if (newVersion > version)
        {
            var newestVersion = _extensionRepository.Download(entry);
            return newestVersion;
        }

        return null;
    }

    private RestartReason Install(IInstalledExtension currentExtension, IInstallableExtension updatedExtension)
    {
        //Uninstall old extension
        _extensionManager.Disable(currentExtension);
        _extensionManager.Uninstall(currentExtension);

        //Install new version
        var restartReason = _extensionManager.Install(updatedExtension, false);

        //Enable the newly installed version of the extension
        var newlyInstalledVersion = _extensionManager.GetInstalledExtension(updatedExtension.Header.Identifier);
        if (newlyInstalledVersion != null)
        {
            _extensionManager.Enable(newlyInstalledVersion);
        }

        return restartReason;
    }
}

标签:vspackage,visual-studio-extensions,visual-studio-package,c,visual-studio
来源: https://codeday.me/bug/20191121/2050207.html