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.

Şu Yazıları da Sevebilirsiniz

Leave a Comment

* Bu formu kullanarak, verilerinizin bu web sitesi tarafından saklanması ve kullanılmasını kabul ediyorsunuz.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bunu kabul ettiğinizi varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul Et Daha Fazla Bilgi