用于SSMS的C#外部工具 - 从stdin读取

时间:2009-01-02 10:49:49

标签: c# stdin ssms

我正在尝试编写一个使用SQL Server Management Studio的外部工具功能的应用程序。

要指定外部工具,您可以输入应用程序的路径,并指定一些参数通过STDIN传递给应用程序。

目前我只有一个显示参数的表单。每次运行外部工具时,我都会得到一个新的应用程序实例。

理想情况下,我希望我第一次运行该工具来加载应用程序,然后每次运行以从STDIN获取参数并对它们执行某些操作而不创建应用程序的新实例。

我能做些什么才能做到这一点,还是我被大量的窗户困住了?

提前致谢

1 个答案:

答案 0 :(得分:0)

听起来很可怕,你可以利用Microsoft.VisualBasic.ApplicationServices来实现这一点(你可以在你的c#项目中添加对Microsoft.VisualBasic的引用)。

作为一个简单的例子,你可以创建一个新的C#WinForms项目并改变Program.cs,看起来像这样:

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());
    }
}

然后在Form1中抛出一个标签和一些代码以显示它正在工作:

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

        label1.Text = output;
    }

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

这个小片段的唯一问题是你在首次启动时获得的命令行参数包括应用程序名称,但它不会包含在后续启动中。