/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this is the place /// where you can put all the initialization code that rely on services provided by VisualStudio. /// </summary> protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress <ServiceProgressData> progress) { Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering InitializeAsync() of: {0}", ToString())); await base.InitializeAsync(cancellationToken, progress); IDEBuildLogger.UserRegistryRoot = UserRegistryRoot; // Switching to main thread to use GetService RPC and cast to service interface (which may involve COM operations) // Note: most of our work is not supposed to be heavy, mostly registration of services and callbacks await this.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); solutionEventsListener = new SolutionEventsListener(this); solutionEventsListener.BeforeSolutionClosed += solutionEventsListener_BeforeSolutionClosed; solutionEventsListener.AfterSolutionBackgroundLoadComplete += solutionEventsListener_AfterSolutionBackgroundLoadComplete; solutionEventsListener.AfterActiveConfigurationChange += SolutionEventsListener_AfterActiveConfigurationChange; solutionEventsListener.StartupProjectChanged += SolutionEventsListener_OnStartupProjectChanged; dte2 = GetGlobalService(typeof(SDTE)) as DTE2; // Register the C# language service // inspiration & credits: https://github.com/IInspectable/Nav.Language.Extensions/commit/08af3d897afac5a54975660fa03f4b629da405e1#diff-b73c0f368f242625f60cfad9cc11f2d5R88 AddService(typeof(NShaderLanguageService), async(container, ct, type) => { await JoinableTaskFactory.SwitchToMainThreadAsync(ct); errorListProvider = new ErrorListProvider(this) { ProviderGuid = new Guid("ad1083c5-32ad-403d-af3d-32fee7abbdf1"), ProviderName = "Xenko Shading Language" }; var langService = new NShaderLanguageService(errorListProvider); langService.SetSite(this); langService.InitializeColors(); // Make sure to initialize colors before registering! return(langService); }, true); // Add our command handlers for menu (commands must exist in the .vsct file) var mcs = await GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService; if (null != mcs) { XenkoCommands.ServiceProvider = this; XenkoCommands.RegisterCommands(mcs); } // Register a timer to call our language service during // idle periods. var mgr = GetService(typeof(SOleComponentManager)) as IOleComponentManager; if (m_componentID == 0 && mgr != null) { OLECRINFO[] crinfo = new OLECRINFO[1]; crinfo[0].cbSize = (uint)Marshal.SizeOf(typeof(OLECRINFO)); crinfo[0].grfcrf = (uint)_OLECRF.olecrfNeedIdleTime | (uint)_OLECRF.olecrfNeedPeriodicIdleTime; crinfo[0].grfcadvf = (uint)_OLECADVF.olecadvfModal | (uint)_OLECADVF.olecadvfRedrawOff | (uint)_OLECADVF.olecadvfWarningsOff; crinfo[0].uIdleTimeInterval = 1000; int hr = mgr.FRegisterComponent(this, crinfo, out m_componentID); } // Go back to async thread await TaskScheduler.Default; }