我正在使用C#创建我的第一个Visual Studio扩展(VSPackage
)。我有两个课程:
class MyPackage : Package
{
...
}
class SomeOtherClass
{
...
}
在加载包之后实例化SomeOtherClass
的对象,并且需要获取对MyPackage
实例的引用。有没有办法获得对MyPackage
对象的引用,而不是将其作为参数传递给SomeOtherClass
的构造函数?
如果我理解你的问题是对的,你可以这样做:
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也应该是静态的;我错过了。
您可以使用IVsShell.IsPackageLoaded
方法获取对任何已加载的VsPackage的引用。
使用IVsShell
基础设施的SVsServiceProvider
属性导入的Import
可以获得对MEF
的引用。
同样,您可以使用ServiceProvider.GlobalProvider
来获取IVsShell
的引用。
我已经投了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引用,而不仅仅是类的实例。