我正在尝试编写一个利用 SQL Server Management Studio 的外部工具功能的应用程序。
要指定外部工具,您可以输入应用程序的路径并指定一些参数以通过 STDIN 传递给应用程序。
目前我只有一个显示参数的表单。每次我运行外部工具时,我都会得到一个新的应用程序实例。
理想情况下,我希望第一次运行该工具来加载应用程序,然后每次运行都从 STDIN 获取参数并对其进行处理,而无需创建应用程序的新实例。
有什么我可以做的可以允许这个,还是我被很多窗户困住了?
提前致谢
尽管听起来很可怕,但您可以利用 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());
}
这个小片段的唯一问题是您在首次启动时获得的命令行参数包括应用程序名称,但在后续启动中不包括在内。