


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!

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.

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

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 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.

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.

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.

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"...

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...


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version
The latest (2018.2.1) professional PHP integrated development tool

SublimeText3 English version
Recommended: Win version, supports code prompts!

WebStorm Mac version
Useful JavaScript development tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

Zend Studio 13.0.1
Powerful PHP integrated development environment