Visual Studio扩展:从装饰中获取包

Visual Studio Extension: Get Package from adornment

我正在开发 Visual Studio 扩展,由以下部分组成:

  1. 一个菜单和一系列命令
  2. 一个工具window
  3. 一个或多个文本视图装饰
  4. AysncPackage 的自定义实现

现在,虽然工具 Window 和命令要么由我的扩展的 AsyncPackage 连接,要么有一个句柄,但我无法弄清楚的是我如何获得自我的句柄-来自我的一个或多个文本装饰的相同 AsyncPackage。

例如,我的工具 Window 扩展了工具 Window 窗格,它通过包的 ProvideToolWindow 属性与包挂钩。我的命令是在 Package 本身内部构造的,因此将句柄传递给 AsyncPackage 非常简单。

我无法解决的问题是您如何在我的任何 TextAdornments 中获取对此 AsyncPackage 的引用。

有什么帮助吗?

这是一个棘手的问题!您必须让 IVsShell 根据与您的包关联的 GUID 检索包,然后将其转换为您的界面(或 IPackage 的基本界面)

 private IMyPackageInterface _myPackage;

 //let's get our hands on that package
var vsShell = (IVsShell) ServiceProvider.GlobalProvider.GetService(typeof(IVsShell));
if (vsShell == null)
{
    throw new NullReferenceException();
}

if (vsShell.IsPackageLoaded(PackageGuid, out var myPossiblePackage) 
    == Microsoft.VisualStudio.VSConstants.S_OK) { 
_myPackage = (IMyPackageInterface)myPossiblePackage;