如何在C和C#应用程序之间进行通信

3
什么是在C和C#进程之间进行通信的最佳方式?我需要从C#进程发送包含命令和参数等消息到C进程,然后C进程必须能够发送回复。我在C#进程中启动C进程。如何实现这一点是最好的方式?我尝试使用标准输入和输出,但这并不奏效(由于某种原因,C进程的标准输入会被一些字符串(x(U+266C)Q)所覆盖(U+266C是UTF8 六十四分音符))。

看起来你有一个编码问题,请参考这个问题:https://dev59.com/InE85IYBdhLWcg3wShaf - jmservera
3个回答

7

您真的需要单独的进程吗?如果您拥有两个代码,为什么不通过导入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代码所使用的库。谢谢! - Pim Jager

3

看起来你没有访问C程序源代码的权限。我建议使用ProcessStartInfo启动你的外部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程序中使用的库。但是感谢您的答案,它非常有帮助。 - Pim Jager

0

你的进程需要并行运行,还是需要启动外部进程并获取其结果?如果你只是启动一个子进程,那么就像评论中所说的那样,你不需要执行传递给子应用程序的数据的UTF16-> ASCII转换。

如果你需要并行运行进程并在它们之间交换消息,请看一下我们的MsgConnect产品,该产品专门为这些任务设计。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接