Získání služby
Pro přístup k různým funkcím často potřebujete získat služby sady Visual Studio. Obecně platí, že služba sady Visual Studio poskytuje jedno nebo více rozhraní, která můžete použít. Většinu služeb můžete získat z balíčku VSPackage.
Jakýkoli balíček VSPackage, který je odvozen od Package a který byl správně siteděný, může požádat o jakoukoli globální službu. Vzhledem k tomu, že Package
třída implementuje IServiceProvider, všechny VSPackage, které jsou odvozeny od Package
, je také poskytovatelem služeb.
Při načtení sady PackageVisual Studio předá IServiceProvider objekt metodě SetSite během inicializace. Tomu se říká přisouzení balíčku VSPackage. Třída Package
zabalí tohoto poskytovatele služeb a poskytuje metodu GetService pro získání služeb.
Získání služby z inicializovaného balíčku VSPackage
Každé rozšíření sady Visual Studio začíná projektem nasazení VSIX, který bude obsahovat prostředky rozšíření. Vytvořte projekt Visual Studio VSIX s názvem
GetServiceExtension
. Šablonu projektu VSIX najdete v dialogovém okně Nový projekt vyhledáním "vsix".Teď přidejte vlastní šablonu položky příkazu s názvem GetServiceCommand. V dialogovém okně Přidat novou položku přejděte do visual C#>Rozšiřitelnost a vyberte Vlastní příkaz. V poli Název v dolní části okna změňte název souboru příkazu na GetServiceCommand.cs. Další informace o tom, jak vytvořit vlastní příkaz, vytvořte rozšíření pomocí příkazu nabídky.
V GetServiceCommand.cs odeberte tělo
MenuItemCommand
metody a přidejte následující kód:IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog; if (activityLog == null) return; System.Windows.Forms.MessageBox.Show("Found the activity log service.");
Tento kód získá službu SVsActivityLog a přetypuje ji do IVsActivityLog rozhraní, které lze použít k zápisu do protokolu aktivit. Příklad najdete v tématu Postupy: Použití protokolu aktivit.
Sestavte projekt a spusťte ladění. Zobrazí se experimentální instance.
V nabídce Nástroje experimentální instance vyhledejte tlačítko Invoke GetServiceCommand . Když kliknete na toto tlačítko, mělo by se zobrazit okno se zprávou, že se našla služba protokolu aktivit.
Získání služby z okna nástroje nebo kontejneru ovládacího prvku
Někdy může být potřeba získat službu z okna nástroje nebo řídicího kontejneru, který nebyl sited, nebo jinak byl sited s poskytovatelem služeb, který neví o požadované službě. Můžete například chtít zapisovat do protokolu aktivit z ovládacího prvku.
Statická GetGlobalService metoda spoléhá na zprostředkovatele služeb uloženého v mezipaměti, který se inicializuje při prvním inicializaci jakéhokoli balíčku VSPackage odvozeného z Package lokality.
Vzhledem k tomu, že konstruktor VSPackage je volána před sited VSPackage, globální služby jsou obvykle nedostupné z konstruktoru VSPackage. Viz Postupy: Řešení potíží se službami pro alternativní řešení.
Tady je příklad způsobu, jak získat službu v okně nástroje nebo jiném prvku než VSPackage.
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;
Získání služby z objektu DTE
Služby můžete získat také z DTEClass objektu. Objekt DTE však musíte získat jako službu z balíčku VSPackage nebo voláním statické GetGlobalService metody.
Objekt DTE implementuje IServiceProvider, který můžete použít k dotazování na službu pomocí GetService.
Tady je postup, jak získat službu z objektu DTE.
// Start with the DTE object, for example:
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));
ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log != null)
{
System.Windows.Forms.MessageBox.Show("Found the activity log service.");
}
}