search
HomeBackend DevelopmentGolangHow to establish long term pipe connection between go and c# console application

How to establish long term pipe connection between go and c# console application

php小编新一为您介绍如何在Go和C#控制台应用程序之间建立长期管道连接。在开发跨平台应用程序时,Go和C#是两种常用的编程语言。建立管道连接可以实现两种语言之间的通信和数据交换。本文将介绍如何使用Go和C#的相关库和API来建立稳定、可靠的长期管道连接,以便实现数据的传输和交互。无论您是Go开发者还是C#开发者,通过本文的指导,您都可以轻松地在两种语言之间建立管道连接,实现应用程序的功能需求。

问题内容

我有非常简单的 C# 控制台应用程序。这将是一个添加从 go 部分传递的 double 变量的过程。

double sum = 0;
bool flag = true;

while(flag) {  // exit on convert error
    var str = Console.ReadLine(); // ask string 

    double addend;
    flag = double.TryParse(str, out addend); // convert to double

    sum += flag ? addend : 0;  //add on success
    Console.WriteLine(sum);
}

return 0;

我的 go 部分也很简单。它使用以前的控制台应用程序创建进程,向其发送字符串并读回结果。

package main

import (
    "fmt"
    "io"
    "log"
    "os/exec"
)

func main() {

    cmd := exec.Command("%path to app%\\ConsoleApp.exe") // process that will be started
    
stdout, err := cmd.StdoutPipe() // use std out pipe
    if err != nil {
        log.Fatal(err)
    }

    stdin, err := cmd.StdinPipe() // use std in pipe
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil { // start
        log.Fatal(err)
    }

    for true {
        var w1 string
        _, err := fmt.Scanln(&w1) // read line

        if err != nil {
            log.Fatal()
        }

        go func() {
            io.WriteString(stdin, w1) // pass it to console app
        }()

        read, err := io.ReadAll(stdout) // read result

        fmt.Println(read)

        if err != nil {
            log.Fatal()
        }
    }
}

我开始调试控制台应用程序的进程(它出现在任务管理器、RMC - 调试中),但存在符号错误,所以我什至无法理解我的应用程序是否获取了字符串。

这只是我的麻烦的一半。我认为我的控制台应用程序有一两次收到字符串(我的意思是以前的时间),但只有第一个,导致管道在传输/复制后关闭。那么我该如何控制呢?我想要执行多个事务、写入和读取,并仅在需要时关闭管道。

编辑:我对 ConsoleApp 做了一些更改。现在看起来像这样:

double sum = 0;
bool flag = true;
while(flag) {
    var str = Console.ReadLine();
    double addend;
    flag = double.TryParse(str, out addend);

    // File creation will indicate that message was recieved. 
    using(StreamWriter writer = new StreamWriter("t.txt")) { 
        writer.WriteLine($"{flag}");
    }

    sum += flag ? addend : 0;
    Console.WriteLine(sum);
}

return 0;

解决方法

所以,@maxm 非常接近(或者甚至已经找到了解决方案,但它对我不起作用,fsr)。

执行部分:

package main

import (
    "bufio"
    "fmt"
    "log"

    "os/exec"
)

func main() {
    cmd := exec.Command("%path to the exe%")

    stdout, err := cmd.StdoutPipe() 
    if err != nil {
        log.Fatal(err)
    }

    stderr, err := cmd.StderrPipe()
    if err != nil {
        log.Fatal(err)
    }

    scanner := bufio.NewScanner(stdout)

    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }

    for {
        var w1 string
        _, err := fmt.Scanln(&w1)
        w2 := []byte(w1) // important! You need convert string to byte array

        if err != nil {
            log.Fatal()
        }

        if _, err := stdin.Write(w2); err != nil { // pass byte array
            log.Fatal(stderr)
            panic(err)
        } 

        if scanner.Scan() {
            read := scanner.Text()
            fmt.Println(read)
        } else {
            if err := scanner.Err(); err != nil {
                panic(err)
            }
        }
    }
}

C# 部分非常简单。首先,您需要从字节数组恢复字符串:

public static string ByteArrayToString(this byte[] byteArray, int size) {
    // get decoder to decode input encoding
    var decoder = Console.InputEncoding.GetDecoder(); 

    // count char that will be restored
    int charCount = decoder.GetCharCount(byteArray, 0, size);

    // initialize char array
    char[] charArray = new char[charCount];
    // restore to char array
    decoder.GetChars(byteArray, 0, size, charArray, 0);

    // get and return string from our char array
    return new string(charArray);
}

接下来是主要部分:

double sum = 0;
bool flag = true;
while(flag) {
    string str;

    using Stream stdin = Console.OpenStandardInput(); // for reading 

    byte[] buffer = new byte[2048];
    int bytes = 0; // bytes count

    while((bytes = stdin.Read(buffer, 0, buffer.Length)) > 0) { // read
        str = buffer.ByteArrayToString(bytes); // restore string
        flag = double.TryParse(str, out double addend);
        sum += flag ? addend : 0;
        Console.WriteLine(sum); //write

        if(!flag)
            break;
    }
}

return 0;

The above is the detailed content of How to establish long term pipe connection between go and c# console application. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:stackoverflow. If there is any infringement, please contact admin@php.cn delete
Golang vs. C  : Code Examples and Performance AnalysisGolang vs. C : Code Examples and Performance AnalysisApr 15, 2025 am 12:03 AM

Golang is suitable for rapid development and concurrent programming, while C is more suitable for projects that require extreme performance and underlying control. 1) Golang's concurrency model simplifies concurrency programming through goroutine and channel. 2) C's template programming provides generic code and performance optimization. 3) Golang's garbage collection is convenient but may affect performance. C's memory management is complex but the control is fine.

Golang's Impact: Speed, Efficiency, and SimplicityGolang's Impact: Speed, Efficiency, and SimplicityApr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

C   and Golang: When Performance is CrucialC and Golang: When Performance is CrucialApr 13, 2025 am 12:11 AM

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

Golang in Action: Real-World Examples and ApplicationsGolang in Action: Real-World Examples and ApplicationsApr 12, 2025 am 12:11 AM

Golang excels in practical applications and is known for its simplicity, efficiency and concurrency. 1) Concurrent programming is implemented through Goroutines and Channels, 2) Flexible code is written using interfaces and polymorphisms, 3) Simplify network programming with net/http packages, 4) Build efficient concurrent crawlers, 5) Debugging and optimizing through tools and best practices.

Golang: The Go Programming Language ExplainedGolang: The Go Programming Language ExplainedApr 10, 2025 am 11:18 AM

The core features of Go include garbage collection, static linking and concurrency support. 1. The concurrency model of Go language realizes efficient concurrent programming through goroutine and channel. 2. Interfaces and polymorphisms are implemented through interface methods, so that different types can be processed in a unified manner. 3. The basic usage demonstrates the efficiency of function definition and call. 4. In advanced usage, slices provide powerful functions of dynamic resizing. 5. Common errors such as race conditions can be detected and resolved through getest-race. 6. Performance optimization Reuse objects through sync.Pool to reduce garbage collection pressure.

Golang's Purpose: Building Efficient and Scalable SystemsGolang's Purpose: Building Efficient and Scalable SystemsApr 09, 2025 pm 05:17 PM

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Why do the results of ORDER BY statements in SQL sorting sometimes seem random?Why do the results of ORDER BY statements in SQL sorting sometimes seem random?Apr 02, 2025 pm 05:24 PM

Confused about the sorting of SQL query results. In the process of learning SQL, you often encounter some confusing problems. Recently, the author is reading "MICK-SQL Basics"...

Is technology stack convergence just a process of technology stack selection?Is technology stack convergence just a process of technology stack selection?Apr 02, 2025 pm 05:21 PM

The relationship between technology stack convergence and technology selection In software development, the selection and management of technology stacks are a very critical issue. Recently, some readers have proposed...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment