2016-04-11 34 views
0

Visual Studio eklentisi geliştiriyorum. Yeni bir çözüm açma olayını yakalamak istiyorum. Bunu başarmak için IVsSolutionEvents arayüzünü uyguladı ve AdviseSolutionEvents() kullanarak kaydettirdim. Bununla birlikte, VS'nin test örneğini çalıştırdığımda ve bir çözüm açtığımda, uygun olay yöntemi çağrılmıyor. Neden OnAfterOpenSolution()Visual Studio 2015'te çözüm olayları yakalama

public sealed class MyPackage : Package, IVsSolutionEvents 
{ 
     // ... 

     protected override void Initialize() 
     { 
      base.Initialize(); 

      IVsSolution solution = GetService(typeof(SVsSolution)) as IVsSolution; 
      uint cookie = 0; 
      solution.AdviseSolutionEvents(this, out cookie); 
     } 

     // ... 

     public int OnAfterOpenSolution(object pUnkReserved, int fNewSolution) 
     { 
      MessageBox.Show("Opened a solution!"); 
      return VSConstants.S_OK; 
     } 
} 

denilen asla: Burada

benim kodudur?

cevap

2

Bunu, 2015'in altındaki Microsoft.VisualStudio.Shell.Interop ad alanında IVsSolutionEvents2 arabirimiyle denediniz mi?

Disregard, bu yöntem kullandığınız arabirim üzerindedir.

Uygulamanız neye benziyor?

İşte soyut sınıfın aracılığıyla bir örnek uygulama:

[CLSCompliant(false)] 
    public abstract class SolutionListener : IVsSolutionEvents, IVsSolutionEvents2, IVsSolutionEvents3, IVsSolutionEvents4, IDisposable 
    { 
     public IServiceProvider ServiceProvider { get; private set; } 

     public IVsSolution Solution { get; private set; } 

     private uint eventsCookie = (uint)ShellConstants.VSCOOKIE_NIL; 
     private bool isDisposed; 
     private static volatile object Mutex = new object(); 

     protected SolutionListener(IServiceProvider serviceProvider) 
     { 
      ServiceProvider = serviceProvider; 

      Solution = serviceProvider.GetService(typeof(SVsSolution)) as IVsSolution; 
      Debug.Assert(Solution != null, "Could not get the IVsSolution object"); 
      if (Solution == null) 
      { 
       throw new InvalidOperationException(); 
      } 
     } 

     public abstract int OnAfterCloseSolution(object reserved); 
     public abstract int OnAfterClosingChildren(IVsHierarchy hierarchy); 
     public abstract int OnAfterLoadProject(IVsHierarchy stubHierarchy, IVsHierarchy realHierarchy); 
     public abstract int OnAfterMergeSolution(object pUnkReserved); 
     public abstract int OnAfterOpenProject(IVsHierarchy hierarchy, int added); 
     public abstract int OnAfterOpenSolution(object pUnkReserved, int fNewSolution); 
     public abstract int OnAfterOpeningChildren(IVsHierarchy hierarchy); 
     public abstract int OnBeforeCloseProject(IVsHierarchy hierarchy, int removed); 
     public abstract int OnBeforeCloseSolution(object pUnkReserved); 
     public abstract int OnBeforeClosingChildren(IVsHierarchy hierarchy); 
     public abstract int OnBeforeOpeningChildren(IVsHierarchy hierarchy); 
     public abstract int OnBeforeUnloadProject(IVsHierarchy realHierarchy, IVsHierarchy rtubHierarchy); 
     public abstract int OnQueryCloseProject(IVsHierarchy hierarchy, int removing, ref int cancel); 
     public abstract int OnQueryCloseSolution(object pUnkReserved, ref int cancel); 
     public abstract int OnQueryUnloadProject(IVsHierarchy pRealHierarchy, ref int cancel); 
     public abstract int OnAfterAsynchOpenProject(IVsHierarchy hierarchy, int added); 
     public abstract int OnAfterChangeProjectParent(IVsHierarchy hierarchy); 
     public abstract int OnAfterRenameProject(IVsHierarchy hierarchy); 
     public abstract int OnQueryChangeProjectParent(IVsHierarchy hierarchy, IVsHierarchy newParentHier, ref int cancel); 

     public virtual void Initialize() 
     { 
      if (Solution != null && eventsCookie == (uint)ShellConstants.VSCOOKIE_NIL) 
      { 
       ErrorHandler.ThrowOnFailure(Solution.AdviseSolutionEvents(this, out eventsCookie)); 
      } 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!isDisposed) 
      { 
       lock (Mutex) 
       { 
        if (disposing && Solution != null && eventsCookie != (uint)ShellConstants.VSCOOKIE_NIL) 
        { 
         ErrorHandler.ThrowOnFailure(Solution.UnadviseSolutionEvents((uint)eventsCookie)); 
         eventsCookie = (uint)ShellConstants.VSCOOKIE_NIL; 
        } 
        isDisposed = true; 
       } 
      } 
     } 
    } 
+0

Teşekkürler ama benim koduyla yanlış olduğunu anladım. – Kao

+1

Çalıştığına sevindim ve evet, gecikmeli yükleme yapardı. Ama genel editör deneyimini daha iyi hale getirmek için küçük şeyler için minnettarım. Hala VS'yi başlatmak veya "Referans ekle" ye tıklamak ve bir şey ortaya çıkana kadar dakikalarca kilitli bir ekrana bakmak ne kadar süreceğini hatırlıyorum. İyileşiyor, böyle şeyler için tüm detayları hatırlamalısın. – Patrick

2

Tamam, bunu anladım.

Varsayılan olarak, Visual Studio paketlerinin, bellek ve CPU'yu tüketmekten kaçınmak için başlangıçta yüklenmediği ortaya çıkıyor. Bunun yerine, Visual Studio gerektiğinde bunları yükler. Bundan dolayı, olaylar daha önce kayıtlı değil.

sınıf tanımı bu eklemek zorunda davranışı ProvideAutoLoad özelliğini değiştirmek için: Bu niteliğin

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] 
public sealed class Command1Package : Package 
... 

değer hiçbir çözüm açılmış olan Guıd örneğin bağlamı için, kullanıcı arayüzü bağlamını tanımlayan bir dizidir.

Source

+1

Yapmaya çalıştığınız şeye bağlı olarak, Çözüm Yüklendiğinde de ProvideAutoload kullanabilirsiniz, bu da çözüm yüklendiğinde yüklenir. Bu şekilde, sadece bir etkinlik için beklemek için başlangıçta çalışmıyorsunuz, başka bir şekilde anlatabiliriz. –

İlgili konular