-4

我正在处理 Windows 窗体。我有两个应用程序,一个是父母,另一个是孩子。在我的主应用程序中,我有一个包含一堆记录的网格。用户需要选择一条记录并单击按钮,我需要将该选定记录的数据作为参数发送到子应用程序,例如,

Process.Start("path to child exe","selected record's data");

之后我会将发送的数据发送到子应用程序,

Environment.GetEnvironmentVariables()[0];

现在,当处理完从父级发送的数据时,子应用程序需要自动关闭。之后,在父应用程序中,gridview 的选定行需要向前移动一行并将选定的行信息发送到子应用程序,并且该过程需要迭代,直到它遍历主应用程序中我的 gridview 中的所有记录。

4

3 回答 3

2

好吧,首先你会注意到;

Process.Start()

返回对System.Diagnostics.Process具有Exited事件的对象的引用。然后,您可以挂钩一个处理程序,该处理程序将继续执行另一行并再次重新启动该过程:

var process = Process.Start("path to child exe","selected record's data");
process.Exited += (sender, args) => 
{
   // do your stuff
}

然后,我建议检查其他选项来执行此操作:

  • 这是一个 .net 托管应用程序吗?您可以只在项目中引用 .exe 程序集并通过提供的接口调用必要的方法吗?
  • 如果这是一个非托管的 Windows 应用程序,您仍然可以调用它的方法。为此使用DllImport

    [DllImport(LibraryName, EntryPoint = FunctionName)]

    private static extern int Function(string param);

然后你就可以从你的代码中调用Function了。谷歌了解详情。

另外,看看:如何在 C# 中调用托管 DLL 文件?

于 2012-12-20T13:04:57.890 回答
0

假设您不需要将数据从子应用程序传回主应用程序:

在您的主应用程序中创建一个递归方法以使用参数启动子应用程序。在我的示例listBox1中包含一个数据项列表:

private void button1_Click(object sender, EventArgs e)
{
    listBox1.SelectedIndex = 0;
    startChild((string)listBox1.SelectedItem);
}

void startChild(string data)
{
    ProcessStartInfo psi = new ProcessStartInfo("child.exe", data);
    Process p = Process.Start(psi);
    p.WaitForExit();
    if (p.HasExited)
    {
        if ((listBox1.SelectedIndex + 1) < listBox1.Items.Count)
        {
            listBox1.SelectedIndex++;
            startChild((string)listBox1.SelectedItem);
        }
    }
}

然后在您的 Child 应用程序中获取参数并处理它们:

public Child()
{
    InitializeComponent();
    var data = Environment.GetCommandLineArgs()[1];
    ProcessDataAndExit(data);
}
于 2012-12-20T13:20:34.487 回答
-1

通过命令行参数传递数据可能会变得混乱。使用套接字会更健壮。

这可能会有所帮助:.NET 中的套接字编程简介

于 2012-12-20T13:01:23.443 回答