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.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir