3

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

Для начала, я пытаюсь запросить 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) Bad Request «.

трассировки стека обеспечивается:

сервера трассировки стека: на System.Runtime.AsyncResult.End [TAsyncResult] (IAsyncResult результат) на System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End (SendAsyncResult результат) в System.ServiceModel.Channels.ServiceChannel.EndCall (String действия, Object [] выходы, IAsyncResult результат) на System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService (IMethodCallMessage methodCall, операцию ProxyOperationRuntime) на System.ServiceModel.Channels. ServiceChannelProxy.Invoke (сообщение с сообщением об ошибке)

Служба размещена по адресу: https://visualstudiogallery.msdn.microsoft.com/services/dev12/extension.svc

Кто-нибудь знает, как я могу создать расширение Visual Studio, которое автоматически обновляется из галереи Visual Studio? Либо через IVsExtensionRepository, либо вручную?

+0

Хм, вам, возможно, придется настроить трассировку пакетов и посмотреть, какой запрос отправляется недействительным. – JaredPar

+0

Да, я думаю, я попробую. Это все за SSL, но я думаю, что это все еще возможно, мне просто потребуется время, чтобы узнать, как это сделать. – JoshVarty

ответ

2

Редактировать: теперь в версиях Visual Studio 2015 загружаются автоматически.

Таким образом, я полностью отказался от запроса IVsExtensionRepository. Я не уверен, почему, но должна быть некоторая внутренняя проблема с запросами, которые он создает. Я запросил ту же услугу, используя предложенный проект ErikEJ, и он работал нормально.

Однако, я не хотел создавать службу из WSDL, как это было сделано SQLCeToolbox. Вместо этого я использовал IVsExtensionRepository, но избегал метода CreateQuery().

Прилагается мой подход к обновлению VSPackage. Вам нужно будет заменить любые идентификаторы GUID или Пакет с информацией о вашем пакете.

ПРИМЕЧАНИЕ Существует одна Гоча»в следующем коде:

Обратите внимание, что CodeConnectRepositoryEntry реализует только DownloadUrl. При обновлении VSPackage это все, о чем нужно беспокоиться, поскольку это позволяет нам загружать новый пакет. Этот URL-адрес можно найти на странице VSGallery для вашего VSPackage.

Однако: Вы должны обрезать 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 загрузит последнюю версию.

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; 
    } 
} 
1

У меня есть код для доступа к сервису и создание RSS-канала из него здесь: sqlcetoolbox.codeplex.com/SourceControl/latest - в файле NuGetDownloadfedd.zip (не имеет ничего общего с Nuget!) - также включает номер версии:

foundItem.Project.Metadata.TryGetValue("VsixVersion", out version); 

Фактически, у меня уже есть служба RSS-каналов, сообщите мне, если вы хотите ее использовать.

+0

Знаете ли вы, что LCID составляет 1033 в FeedHandler.cs? (Если нет, это нормально, я просто не знаю, что он представляет) – JoshVarty

+1

Вы притворяетесь, что вызываете веб-сервис из английской версии Visual Studio ... – ErikEJ

Смежные вопросы