【问题标题】:How to communicate between a C and a C# application如何在 C 和 C# 应用程序之间进行通信
【发布时间】:2010-09-30 11:30:49
【问题描述】:

在 C 和 C# 进程之间进行通信的最佳方式是什么。我需要从 C# 进程发送包含命令和参数等的消息。到C进程。然后C进程必须能够发送回复。

我在C#进程中启动C进程。

实现这一目标的最佳方法是什么?我尝试使用标准输入和标准输出,但效果不佳(由于某种原因,C 进程的标准输入被一些字符串 (x(U+266C)Q) 发送垃圾邮件)(U+266C 是 UTF8 beamed sixteen note

【问题讨论】:

标签: c# c communication


【解决方案1】:

您真的需要单独的进程吗?如果您拥有这两个代码,为什么不通过导入 c 库方法进行互操作调用:

class Program
{
    [DllImport("yourlibrary.dll")]
    public static extern int YourMethod(int parameter);

    static void Main(string[] args)
    {
        Console.WriteLine(YourMethod(42));
    }
}

然后在您的 C 库中使用 .def 文件导出您的方法:

LIBRARY "yourlibrary"
  EXPORTS
     YourMethod

【讨论】:

  • 最后发现我们可以只使用 C 代码在 C# 中使用的库。谢谢!
【解决方案2】:

听起来您无权访问 C 程序源代码。我会使用 ProcessStartInfo 来启动你的 extern C 程序。但在你这样做之前,你重定向输入/输出。请参阅下面的示例代码:

    private void start()
{
    Process p = new Process();
    StreamWriter sw;
    StreamReader sr;
    StreamReader err;
    ProcessStartInfo psI = new ProcessStartInfo("cmd");
    psI.UseShellExecute = false;
    psI.RedirectStandardInput = true;
    psI.RedirectStandardOutput = true;
    psI.RedirectStandardError = true;
    psI.CreateNoWindow = true;
    p.StartInfo = psI;
    p.Start();
    sw = p.StandardInput;
    sr = p.StandardOutput;
    sw.AutoFlush = true;
    if (tbComm.Text != "")
        sw.WriteLine(tbComm.Text);
    else
        //execute default command
        sw.WriteLine("dir \\");
    sw.Close();
    textBox1.Text = sr.ReadToEnd();
    textBox1.Text += err.ReadToEnd();
}

【讨论】:

  • 谢谢。事实证明,我们可以完全忽略 C 程序并使用 C 程序中使用的库。不过谢谢你的回答,很有帮助。
【解决方案3】:

您的流程是否需要并行运行,或者您启动外部流程并需要获取其结果?如果您只是启动一个子进程,那么,如评论中所述,您不会对传递给子应用程序的数据执行 UTF16->ASCII 转换。

如果您需要并行运行进程并在它们之间交换消息,请查看我们的 MsgConnect 产品,该产品专为此类任务而设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多