如何获取VSPackage MSVS扩展中的Package对象的引用?

问题描述 投票:1回答:3

我正在使用C#创建我的第一个Visual Studio扩展(VSPackage)。我有两个课程:

class MyPackage : Package
{
    ...
}

class SomeOtherClass
{
    ...
}

在加载包之后实例化SomeOtherClass的对象,并且需要获取对MyPackage实例的引用。有没有办法获得对MyPackage对象的引用,而不是将其作为参数传递给SomeOtherClass的构造函数?

c# visual-studio vspackage
3个回答
1
投票

如果我理解你的问题是对的,你可以这样做:

class MyPackage : Package
{
    private static MyPackage _instance;
    public static MyPackage Instance
    { 
        get
        {
            if(_instance != null)
                _instance = new MyPackage();
             return _instance;
         }
     }
}

class SomeOtherClass
{
     void Whatever()
     {
           // use MyPackage.Instance
     }
}

但只有在整个应用程序的生命周期中需要一个MyPackage实例时,这才是可靠的。否则,将MyPackage的新实例传递给SomeOtherClass。

编辑:局部变量_instance也应该是静态的;我错过了。


1
投票

您可以使用IVsShell.IsPackageLoaded方法获取对任何已加载的VsPackage的引用。

使用IVsShell基础设施的SVsServiceProvider属性导入的Import可以获得对MEF的引用。

同样,您可以使用ServiceProvider.GlobalProvider来获取IVsShell的引用。


1
投票

我已经投了SergeyT的答案。推理是这样的:

VS Package不仅仅是一个可以像任何其他类一样实例化的类。它是一个由Visual Studio加载的特殊类,并作为Singleton保存在内存中。此程序包连接到各种VS事件,旨在作为整体扩展的各个部分的功能提供者。

获取它的实例与获取Visual Studio加载的实际包不同。

为了完成您的目标,您需要使用代码,正如SergeyT建议的那样:

 var vsShell = (IVsShell) ServiceProvider.GlobalProvider.GetService(typeof(IVsShell));
        if(vsShell.IsPackageLoaded(MyPackageGuid, out var myPackage) 
           == Microsoft.VisualStudio.VSConstants.S_OK) { 
        _myPackage = (IMyPackage)myPackage;
        }

通过这样做,您可以确保获得唯一的Package引用,而不仅仅是类的实例。

© www.soinside.com 2019 - 2024. All rights reserved.