gpt4 book ai didi

c# - 自动更新 Visual Studio 扩展

转载 作者:行者123 更新时间:2023-11-30 16:10:20 25 4
gpt4 key购买 nike

我正在尝试让我的扩展在新版本推送到 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(字符串操作,对象 [] 输出,IAsyncResult 结果) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeEndService(IMethodCallMessage 方法调用,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 的建议项目查询了相同的服务,它运行良好。

但是,我不想像 SQLCeToolbox 那样从 WSDL 构建服务。相反,我使用了 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;
}
}

关于c# - 自动更新 Visual Studio 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com