Açılışta Otomatik Yüklenen VSIP Paketlerinde Boş Gelen DTE’ler

 VSIP paketimi otomatik olarak açılışta yüklenebilmesi için aşağıdaki kodu kullanarak işaretlemiştim:

[ProvideAutoLoad(UIContextGuids.NoSolution)]

 Bu arada merak edenler için; otomatik paket yükleme hakkıda daha fazla bilgiyi ilgili yazımda bulabilirsiniz.
 Paketimi bu şekilde işaretlemenin ardından initialize methodumun içerisinde DTE nesnesine aşağıdaki kodla ulaşmaya çalıştım :

[DTE dte = GetService(typeof(DTE))

     Ama her ne denediysem DTE nesnesi boş geliyordu. Bu garip bir durumdu, çünkü Yukarıda belirttiğim ProvideAutoLoadAttribute ile paketimi işaretlemeden önce böyle bir problem yaşamıyordum. Peki yanlış olan ne?

    Aslına bakarsanız paketimin Visual Studio açılışı sırasında yüklendiği için henüz DTE nesnesi hazır durumda değil. Bu benim için kötü haberdi. Ama unutmayın her kötü haberden sonra bir iyi haber vardır
    Visaul Studio yükleme işlemini bitirdiğinde IVsShell arayüzü saysinde size haber verir. Bunun için __VSSPROPID.VSSPROPID_Zombie özelliğindeki değişiklikleri dinlemeliyiz. Çünkü bu özellik doğrudan yanlışa değiştiğinde artık DTE nesnesi hazır haldedir. Aşağıda bütün bu olan biteni özetleyen örnek bir kod bulabilirsiniz
 

public class MyNestedPackage : ProjectPackage, IVsShellPropertyEvents {
    private DTE dte;
    private uint cookie;

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

        //Set an eventlistener for shell property changes since we ant to know when the zombie state changes from true to false
        IVsShell shellService = GetService(typeof(SVsShell)) as IVsShell;

        if (shellService != null)
            ErrorHandler.ThrowOnFailure(shellService.AdviseShellPropertyChanges(this, out cookie));
        //Continue initialize ...
        this.RegisterProjectFactory(new MyNestedProjectFactory(this));
    }

    #region IVsShellPropertyEvents Members
    public int OnShellPropertyChange(int propid, object var) {
        // If zombie state changes from true to false we can go ahead and
        // ask for the DTE service and then stop listening for property changes
        if ((int)__VSSPROPID.VSSPROPID_Zombie == propid) {
            if ((bool)var == false) {
                this.dte = GetService(typeof(DTE)) as DTE;
                IVsShell shellService = GetService(typeof(SVsShell)) as IVsShell;
                if (shellService != null)
                    ErrorHandler.ThrowOnFailure(shellService.UnadviseShellPropertyChanges(this.cookie));
                this.cookie = 0;
            }
        }

        return VSConstants.S_OK;
    }
    #endregion
}

        Özellikle belirtmek isterim ki, bu kod benim tarafımdan yazılmış bir kod değildir. Kodun orjinal yazarı Ole Preisler – MSFT‘dır ve MSDN forumlarında sorduğum bir soruya yanıt olarak gönderilmiştir.

Leave a Comment

en_USEnglish