3

새 버전을 Visual Studio Gallery에 푸시 할 때 내 확장 프로그램이 자동으로 업데이트되도록하려고합니다. 이를 달성하는 방법에 대한 몇 가지 지침이 있지만, 몇 살이고 적용되지 않을 수도 있습니다. Query_ExecuteCompleted에서Visual Studio Extension 자동 업데이트

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(); 

내가 서버에서 예외를 수신하고 있습니다 : 우선 들어

, 나는 다음과 같이 IVsExtensionRepository를 조회하기 위해 노력하고있어 "원격 서버에서 오류를 반환했습니다 : (400) 잘못된 요청 . "

스택 트레이스가 제공된다 :

서버 스택 트레이스 : System.Runtime.AsyncResult.End [TAsyncResult (IAsyncResult를 결과)에 System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.End에서 (SendAsyncResult 결과)에 System.ServiceModel.Channels.ServiceChannel.EndCall (문자열 작용 [] 아웃, 결과 된 IAsyncResult) System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService에서 (methodCall을 IMethodCallMessage, ProxyOperationRuntime 동작)에 System.ServiceModel.Channels 개체. ServiceChannelProxy.Invoke (IMessage 메시지)

서비스는 다음 주소에서 호스팅됩니다. 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가 제안한 프로젝트를 사용하여 동일한 서비스에 대해 질의했으며, 문제가 없었다.

그러나 SQLCeToolbox가 수행 한 것처럼 WSDL에서 서비스를 구성하고 싶지 않았습니다. 대신 IVsExtensionRepository을 사용했지만 CreateQuery() 메서드는 사용하지 않았습니다.

첨부 파일이 VSPackage를 업데이트하는 방식입니다. GUID 또는 패키지 특정 이름을 패키지 정보로 바꿔야합니다.

CodeConnectRepositoryEntry 것으로 만 DownloadUrl을 구현

참고는 다음 코드에서 하나 잡았다 '이있다. VSPackage를 업데이트 할 때 새로운 패키지를 다운로드 할 수 있으므로 걱정할 필요가 없습니다. 이 URL은 VSPackage의 VSGallery 페이지에서 찾을 수 있습니다.그러나

: 다음과 같이 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; 
    } 
} 
1

서비스에 액세스하여 여기에서 RSS 피드를 생성하는 코드가 있습니다. sqlcetoolbox.codeplex.com/SourceControl/latest - NuGetDownloadfedd.zip 파일 (Nuget과 관련 없음) - 또한 버전 번호 :

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

사실 저는 이미 RSS 피드 서비스를 호스팅하고 있습니다. 사용하려는 경우 알려주십시오.

+0

FeedHandler.cs에서 LCID가 1033임을 알 수 있습니까? (괜찮지 않다면, 그것이 무엇을 나타내는지는 모르겠다.) – JoshVarty

+1

영어 버전의 Visual Studio에서 webservice를 호출하는 것처럼 보이지만 ... – ErikEJ