Visual Studio Açılış Ekranını Durdurmak

4. June 2006

İşte size Visual Studio açılış ekranında tasarımını yaptığınız Visual Studio Paketinin gösterilip gösterilmediğini anlamnıza yarayacak basit ama kullanışlı bir parametre:

/splash
     Bu parametre sayesinde, Visual Studio basit bir "Devam etmek için Ok'ye basın" yazılı basit bir dialog gösterecektir. Siz ok tuşuna basmadığınız sürece de Visual Studio Açılış ekranında bekleyecektir.
    Aşağıdaki komut satırı ise Visual Studio'nun deneysel kayıt kütüğü üzerinde çalışırken bu dialoğu göstermesini sağlayacaktır:
devenv /rootsuffix Exp /splash
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

VSIP, Visual Studio, Türkçe ,

How to Pause Visual Studio Splash Screen

25. May 2006

Here is a simple yet usefull swith for visual studio to test your VSPackage's splash screen support:

/splash

   With that switch, Visual studio simply displays a dialog saying "click OK to continue" which pauses VS
Following commandline can be used to pause vs for exprimental enviroment:

devenv /rootsuffix Exp /splash
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

English, Visual Studio, VSIP ,

Generating Registery Entries for Your VSIP package Installer

28. April 2006

If you have finish development of your package; you should probably looking for ways to create installer. Simply create an install project on VS; add output of your package. Finally you should insert some registery entries to register it on client's machine.

   To do so is quiet simply; just open a Visual Studio command prompt and type the following :

RegPkg /root:Software\Microsoft\VisualStudio\8.0 /codebase MyPackage.dll /regfile:Package.reg
     This will create a registery file with the name Package.reg. Open your installer project, select registery edit page; and finally import that file.

   You've done! Build your installer and deploy to your clients.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

VSIP, English

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

28. April 2006

 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.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

VSIP, Türkçe

VSIP Paketiniz İçin Kayıt Kütüğü Girdilerini Oluşturmak

28. April 2006

Eğer VSIP paketinizin geliştirme süreci bittiyse; muhtemelen şu an da lurulumunu hazırlamakla meşgulsunuzdur. Bunun için yapmanız gereken şey, basitçe, bir Visual Studio kurulum projesi oluşturmak ve paketinizin çıktısını bu kuruluma eklemek. Ardında da son kullanıcının makinesinde paket kaydınızın yapılabilmesi için bazı kayıt kütüğü girdilerine ihtiyacınız olacaktır.

   Bunu yapmak aslına bakarsanız gözünüzde büyüttüğünüz kadar zor değil. İlk olarak Visual Studio komut satırına geçerek aşağıdaki komutu işletin :

RegPkg /root:Software\Microsoft\VisualStudio\8.0 /codebase Paketim.dll /regfile:Paket.reg

    RegPkg uygulaması sizin için paketinizi analiz ederek (vermiş olduğunuz attribute'lere bakarak) gerekli olan kayıt kütüğü girdilerini Paket.reg yazacaktır. Ardından kurulum prohjenizi çarak oluşturulmuş olan bu reg uzantılı dosyayı projenin kayıt kütüğü bölümünde ithal edin (bazı kelimelerin türkçesi bana garip geliyor, sanırım bunlara alışmam zaman alacak -import edin-)

   İşt ehepsi bu kadar, bitti! Artık gönül rahatlığıyla kurulum projenizi derleyerek son kullanıcıda kurabilirsiniz.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

VSIP, Türkçe

Generating Registery Entries for Your VSIP package Installer

28. April 2006

If you have finish development of your package; you should probably looking for ways to create installer. Simply create an install project on VS; add output of your package. Finally you should insert some registery entries to register it on client's machine.

To do so is quiet simply; just open a Visual Studio command prompt and type the following :

RegPkg /root:Software\Microsoft\VisualStudio\8.0 /codebase MyPackage.dll /regfile:Package.reg

This will create a registery file with the name Package.reg. Open your installer project, select registery edit page; and finally import that file.
You've done! Build your installer and deploy to your clients.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

English, VSIP

Null DTE when VSIP Package is Auto Loaded on Startup

28. April 2006

In my VSIP package, I've mark with the following attribute to indicade it should load at startup:

[ProvideAutoLoad(UIContextGuids.NoSolution)]

You can find details about other auto load options on my other post.
And then in initialize function I've try to get DTE object with the following code .

DTE dte = GetService(typeof(DTE))

But DTE is allways null. What's wrong with my code?

    In fact, the problem is since shell is not fully loaded, DTE object is unavaliable. That was the bad news. But with every bas news, there should be good also :)
    Visaul Studio would notify us when it finished loading via IVsShell interface. We should listen property changes on __VSSPROPID.VSSPROPID_Zombie. When it changes from true to false; its time to retrieve DTE object. Here is the sample code that explains how to get notified when VS fully loaded :

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
}

        Note that, this code is not written by me. Orginal author is Ole Preisler - MSFT and the code is send by him to my question on MSDN forums.

Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

English, VSIP

Visual Studio Paketleriniz Açılışta Yüklensin

15. April 2006

Üzerinde çalıştığım Visual Studio Paketlerinden birisinde çalışma zamanında otomatik olarak oluşturulan menülerim var. Bu sayede daha az uğraşarak Visual Studio içerisine menü ekleyebilmek, aynı zamanda da daha esnek bir mimariye sahip oluyordum. Fakat getirilerinin yanında bu mimari problemler getiriyor; menülerim kendi paketim içerisindeki kodlarla oluşturulduğu için paketimin Visual Studio tarafında başlangıçta yüklenmek zorunda. Mevcut yapısında paketim ancak uzantısını verdiğim dosya türümün kullanıcı tarafından açılması ve editörümün oluşturulmasıyla veya dinamik olmayan menülerimden birisini tıklamasıyla çalışıyordu. Bu problemi nasıl aşabileceğimi düşünürken Windows Kayıt defterine bir göz atmaya karar verdim; bu sayede problemimi çözmek için bir ipucu bulurum diye umdum. Öyle de oldu; kayıt defteri içerisinde HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0 (tabi bu Visual Studio 2005 için geçerli; eğer 2003 kullanıyorsanız bakmanız gereken yer HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.1 olacaktır)altında AutoLoadPackages adıyla bir kayıt buldum. Ama bu seferde başka bir problem vardı karşımda; bu kayıt altındakiler GUID'lerdi sadece, tek başlarına bir anlam ifade etmiyordu :\ İçlerinde birini seçerek internette araştırma yapmaya karar verdim. Neyse, detaylarla sizi çok fazla sıkmak istemem, araştırmam sonunda gördüm ki bu GUID'ler özel durumları ifade etmek için kullanılıyor ve sadece başlangıç'ı ifade eden bir GUID yok. Bunun yerine kullanılması gereken kayıt UICONTEXT_NoSolution için tanımlanmış olan GUID {0xadfc4e64, 0x0397, 0x11d1, {0x9f, 0x4e, 0x00, 0xa0, 0xc9, 0x11, 0x00, 0x4f}}, başka bir deyişle {ADFC4E64-0397-11D1-9F4E-00A0C911004F}. Bu girdi Visual Studio hiç bir proje yüklü olmadığı durumu ifade ediyor; ama siz herhangi bir dosyayı veya projeyi seçip açmış bile olsanız Visual Studio ilk olarak bu durumla açılır ve ardından projeyi yükler.

Tek yapmanız gereken yukarıda belirttiğim adres altındaki GUID içerisine DWord olarak bir kendi paketinizin GUIDsini eklemek.

Unutmadan ekleyim, Visual Studio 2003/2005 SDK'sı ile birlikte gelen vsshell.h dosyası içerisinde başka kullanışlı GUID'ler de bulabilirsiniz.

Umarım bu bilgi işinize yarar.

GÜNCELLEME 19.04.2006 :
Tamamen farklı bir konuyu araştırırken yukarıda bahsettiğim probleme çok daha kolay bir çözüm buldum. Tek yapmanız gereken aşağıdaki Attribute'ü paketinizin başına koymak :

ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")]
ya da daha basit bir şekild :
  ProvideAutoLoad(UIContextGuids.NoSolution)]

    UIContextGuids'i daha yakından inceleyecek olursanız işinize yarayacak başka GUID'ler de bulabilirsiniz.
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, Visual Studio, VSIP ,

Visual Studio 2005 Deneysel kayıt Kütüğünü Sıfırlamak

6. April 2006

  Visual Studio 2005'e VSIP ile eklenti yazıyorsanız ve bir şeyler yolunda gitmediyse (ki olması muhtemeldir) endişelenmenize gerek yok.VSIP ile Visual Studio'ya eklenti yazarken sizi Exp uzantılı ayrı bir kayıt kütüğünde çalıştırır, bu sayede eklentiden kaynaklanabilecek olası problemler geliştirme ortamınızı etkilemeyecektir. Visual Studio'yu ilgili kayıt bloğunda çalıştırmak için tek yapmanız gereken "devenv /rootsuffix Exp"; bu parametre Visual Studio'ya Exp uzantılı kayıt bloğunu kullanmasını söyleyecektir. Bu kayıt kütüğünü sıfırlamak için ise aşağıdaki komutu komut satırından işletmek :

<VSIP-Kurulum-Adresi>\VisualStudioIntegration\Tools\Bin\VsRegEx.exe GetOrig 8.0 Exp

Yapmanız gereken tek şey VSIP-Kurulum-Adresini gerçek VSIP adresiyle değiştirmeniz.

Alternatif bir başka yöntem ise Visual Studio'yu aşağıdaki parametrelerle çalıştırmaktır :

devenv /rootsuffix Exp /setup
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

C#, Visual Studio, VSIP, Türkçe ,