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.
b2e2df97-9ede-4ee3-89d7-8639393a034f|0|.0
VSIP, Türkçe
vsip