【问题标题】:How can I send data between two programs in C#?如何在 C# 中的两个程序之间发送数据?
【发布时间】:2010-02-22 14:09:01
【问题描述】:

我有两个应用程序 --> App1 和 App2。 App1 通过使用 System.Diagnostic.Process() 传递一些命令行参数来打开 App2。用户现在访问 App2。

但是,当用户更改 App1 中的某些命令参数时,我需要打开现有应用程序(App2)而不使用新参数关闭它。

我该怎么做?

任何反馈都会有所帮助。

【问题讨论】:

  • 我不想变得聪明或粗鲁,但标点符号是你的朋友。请参阅在最后一个陈述中,我使用了撇号、逗号和句号来帮助澄清我在说什么。当人们不必花时间解决您的问题时,他们更愿意提供帮助。
  • 是的,标点符号是你的朋友,不要粗鲁,但并不是每个人都以英语为第一语言。
  • 您应该尝试更新您的问题标题,例如“如何在 C# 中的两个程序之间发送参数?”看到你的问题的人知道它是关于什么的,这会更有帮助。
  • 考虑到 Remoting 已被弃用,为什么要添加该标签?
  • @Muad'Dib(或者我应该叫你保罗吗?):好点,但对我来说,它读起来更像是文字说一代使用的停顿英语,而不是外国人的停顿英语语言使用者。那只是我的印象。对造成的任何冒犯表示歉意。

标签: c# wcf c#-3.0 remoting


【解决方案1】:

另一个选项可能是基于 WCF 的解决方案。 见WCF Chat Sample

【讨论】:

  • +1 因为在当前版本的 .Net 上,WCF 是进行 IPC 时的选择。
【解决方案2】:

您应该使用 IPC。请参阅IPC Mechanisms in C# - Usage and Best Practices 获取一些有用的链接。

【讨论】:

  • 从技术上讲,您是在重申最初的问题,因为 IPC 两个不同进程之间的通信。通过您的链接,很明显您指的是带有 WCF 的 IPC,这是解决此问题的好方法。
【解决方案3】:

为什么不使用套接字(客户端和服务器)的普通旧 TCP/IP。

【讨论】:

    【解决方案4】:

    您想做的事情并不简单。在 .net 中执行此操作的预打包方式称为 Remoting,它内置在框架中并允许 IPC(进程间调用)。

    根据您的经验水平,您最好推出自己的简化版本。例如让这两个程序使用文件传递数据。

    App1 将参数写入文本文件(XML,定界,您真的可以选择)。

    在 App2 上有一个定时器,它每 10 秒唤醒一次,并检查是否有新的参数文件。如果是这样,它会使用它并删除文件。

    更新
    正如 John Saunders 正确指出的那样,Remoting 已被 WCF 取代,但是仍然有很多关于 Remoting 的信息,它可能不是一个糟糕的起点。

    【讨论】:

    • 实际上,远程处理已被弃用,取而代之的是 WCF。
    • @John:是的,我似乎记得被宣布过。为什么我从未被邀请参加做出这些决定的会议?这可能是某个过度劳累的 Microsoft 仆从的疏忽,或者有一天所有那些旧的、过时的邀请都会找到我并涌入我的邮箱。 . .现在任何一天。 . .
    • 我相信 WCF 的学习曲线有些陡峭,但所需的协议看起来很简单,应该有很好的示例代码用于类似的简单通信。
    • @Greg:WCF 的简单使用非常简单——只是一些术语上的差异。
    • @Binary:我找不到关于 Remoting 被弃用的声明。不过,这很明显。一旦你的大部分功能被替换,就没有多少空间了。
    【解决方案5】:

    我会选择WindowsFormsApplicationBase 类(来自Microsoft.VisualBasic 程序集),并在myProgram.cs 文件中使用以下代码:

    using System;
    using System.Windows.Forms;
    using Microsoft.VisualBasic.ApplicationServices;
    
    namespace TestSolution
    {
        sealed class Program : WindowsFormsApplicationBase
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main(string[] commandLine)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                var program = new Program()
                {
                    IsSingleInstance = Properties.Settings.Default.IsSingleInstance
                };
    
                // Here you can perform whatever you want to perform in the second instance
    
                // After Program.Run the control will be passed to the first instance    
                program.Run(commandLine);
            }
    
            protected override void OnCreateMainForm()
            {
                MainForm = new ImportForm();
            }
    
            protected override bool OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
            {
                // This code will run in the first instance
    
                return base.OnStartupNextInstance(eventArgs);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多