2009-01-02 13 views
0

J'essaie d'écrire une application qui utilise la fonctionnalité des outils externes de SQL Server Management Studio.C# outil externe pour SSMS - Lecture de stdin

Pour spécifier un outil externe, vous pouvez entrer un chemin d'accès à l'application et spécifier certains arguments à transmettre à l'application via STDIN.

Actuellement, j'ai juste un formulaire qui affiche les arguments. Chaque fois que je lance l'outil externe, je reçois une nouvelle instance de l'application.

Idéalement, je voudrais pour la première fois que je lance l'outil pour charger l'application, et chaque exécution ultérieure pour prendre les arguments de STDIN et faire quelque chose avec eux sans créer une nouvelle instance de l'application.

Y at-il quelque chose que je peux faire qui pourrait permettre cela, ou suis-je coincé avec beaucoup de fenêtres?

Merci à l'avance

Répondre

0

Aussi horrible que cela puisse paraître, vous pouvez tirer parti de Microsoft.VisualBasic.ApplicationServices pour faire de ce très simple (vous pouvez ajouter une référence à Microsoft.VisualBasic dans votre projet C#).

Comme un exemple rapide, vous pouvez créer un nouveau projet WinForms C# et modifier Program.cs à ressembler à quelque chose comme ceci:

class Program : WindowsFormsApplicationBase 
{ 
    static Form1 mainForm = null; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] commandline) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Program prog = new Program(); 
     prog.MainForm = mainForm = new Form1(); 
     prog.Run(commandline); 
    } 

    public Program() 
    { 
     this.IsSingleInstance = true; 
    } 

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) 
    { 
     base.OnStartupNextInstance(eventArgs); 
     mainForm.Startup(eventArgs.CommandLine.ToArray()); 
    } 
} 

Ensuite, dans le Form1 jeter une étiquette là-bas et un peu de code pour montrer il fonctionne:

public void Startup(string[] commandLine) 
    { 
     string output = ""; 
     foreach (string arg in commandLine) 
      output += arg + "\n"; 

     label1.Text = output; 
    } 

    public Form1() 
    { 
     InitializeComponent(); 
     Startup(Environment.GetCommandLineArgs()); 
    } 

le seul Gotcha avec ce petit extrait est que les arguments de ligne de commande que vous obtenez le premier lancement comprennent le nom de l'application, mais il ne figure pas sur les lancements ultérieurs.