Inhaltsverzeichnis
问题内容
解决方法
Heim Backend-Entwicklung Golang So stellen Sie eine langfristige Pipe-Verbindung zwischen Go und der C#-Konsolenanwendung her

So stellen Sie eine langfristige Pipe-Verbindung zwischen Go und der C#-Konsolenanwendung her

Feb 13, 2024 pm 10:50 PM
跨平台应用

So stellen Sie eine langfristige Pipe-Verbindung zwischen Go und der C#-Konsolenanwendung her

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;
Nach dem Login kopieren

我的 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()
        }
    }
}
Nach dem Login kopieren

我开始调试控制台应用程序的进程(它出现在任务管理器、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;
Nach dem Login kopieren

解决方法

所以,@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)
            }
        }
    }
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

接下来是主要部分:

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;
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo stellen Sie eine langfristige Pipe-Verbindung zwischen Go und der C#-Konsolenanwendung her. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die C++-Open-Source-Bibliotheken? Was sind die C++-Open-Source-Bibliotheken? Apr 22, 2024 pm 05:48 PM

C++ bietet einen umfangreichen Satz an Open-Source-Bibliotheken, die die folgenden Funktionen abdecken: Datenstrukturen und Algorithmen (Standard Template Library), Multithreading, reguläre Ausdrücke (Boost), lineare Algebra (Eigen), grafische Benutzeroberfläche (Qt), Computer Vision (OpenCV), maschinelles Lernen (TensorFlow) Verschlüsselung (OpenSSL) Datenkomprimierung (zlib) Netzwerkprogrammierung (libcurl) Datenbankverwaltung (sqlite3)

Detaillierte Erläuterung der Qt-Installation unter Debian und der Qt-Installation unter Debian 10 Detaillierte Erläuterung der Qt-Installation unter Debian und der Qt-Installation unter Debian 10 Feb 12, 2024 pm 06:40 PM

Qt ist ein plattformübergreifendes C++-Anwendungsentwicklungsframework. Es wird häufig zum Entwickeln von GUI-Anwendungen verwendet. In diesem Artikel wird die Methode zur Installation von Qt unter dem Debian-System ausführlich vorgestellt. und Spezifische Schritte zur Installation von Qt in Debian10. Qt unter Debian wird im Debian-System installiert. Die folgenden Schritte sind für die Installation von Qt im Debian-System erforderlich: 1. Öffnen Sie das Terminal und aktualisieren Sie die Paketliste: „shellsudoapt-getupdate“. `` 2. Installieren Sie die Qt-Bibliothek und die integrierte Entwicklungsumgebung QtCreator: sudoapt-ge

Entdecken Sie die zukünftigen Entwicklungstrends der Go-Sprache Entdecken Sie die zukünftigen Entwicklungstrends der Go-Sprache Mar 24, 2024 pm 01:42 PM

Titel: Erkundung der zukünftigen Entwicklungstrends der Go-Sprache Mit der rasanten Entwicklung der Internettechnologie werden auch Programmiersprachen ständig weiterentwickelt und verbessert. Unter anderem ist die von Google entwickelte Open-Source-Programmiersprache Go (Golang) wegen ihrer Einfachheit, Effizienz und Parallelitätsfunktionen sehr gefragt. Da immer mehr Unternehmen und Entwickler beginnen, die Go-Sprache zum Erstellen von Anwendungen zu verwenden, hat der zukünftige Entwicklungstrend der Go-Sprache große Aufmerksamkeit erregt. 1. Eigenschaften und Vorteile der Go-Sprache Die Go-Sprache ist eine statisch typisierte Programmiersprache mit Garbage-Collection-Mechanismus und

Merkmale und Vorteile der C-Sprache: Warum ist sie eine der beliebtesten Programmiersprachen? Merkmale und Vorteile der C-Sprache: Warum ist sie eine der beliebtesten Programmiersprachen? Feb 23, 2024 am 08:39 AM

Merkmale und Vorteile der C-Sprache: Warum ist sie eine der beliebtesten Programmiersprachen? Als universelle Programmiersprache auf hohem Niveau verfügt die Sprache C über viele einzigartige Merkmale und Vorteile, weshalb sie zu einer der beliebtesten Programmiersprachen geworden ist. In diesem Artikel werden die Merkmale und Vorteile der C-Sprache sowie ihre breite Anwendung in verschiedenen Bereichen untersucht. Erstens verfügt die C-Sprache über eine prägnante Syntax und eine klare Struktur. Im Vergleich zu anderen Programmiersprachen ist die Syntax der C-Sprache relativ einfach und leicht zu verstehen und zu erlernen. Es nutzt die Eigenschaften natürlicher Sprache, um Programmierern dies zu ermöglichen

So packen Sie die EXE-Datei des Pycharm-Projekts in APK So packen Sie die EXE-Datei des Pycharm-Projekts in APK Apr 03, 2024 pm 07:24 PM

PyCharm kann Python-Projekte nicht direkt als APKs verpacken. PyCharm konzentriert sich auf die Python-Entwicklung, während APKs zum Ausführen von Apps auf Android-Geräten verwendet werden. Das Packen eines Python-Projekts als APK erfordert zusätzliche Tools und Schritte.

Was ist besser: Uniapp oder native Entwicklung? Was ist besser: Uniapp oder native Entwicklung? Apr 06, 2024 am 05:06 AM

Bei der Wahl zwischen UniApp und nativer Entwicklung sollten Sie Entwicklungskosten, Leistung, Benutzererfahrung und Flexibilität berücksichtigen. Die Vorteile von UniApp sind plattformübergreifende Entwicklung, schnelle Iteration, einfaches Lernen und integrierte Plug-Ins, während die native Entwicklung in Bezug auf Leistung, Stabilität, native Erfahrung und Skalierbarkeit überlegen ist. Wägen Sie die Vor- und Nachteile basierend auf den spezifischen Projektanforderungen ab. UniApp eignet sich für Anfänger, und die native Entwicklung eignet sich für komplexe Anwendungen, die eine hohe Leistung und ein nahtloses Erlebnis anstreben.

Vor- und Nachteile der Verwendung von Chinesisch bei der Benennung von Java-Variablen Vor- und Nachteile der Verwendung von Chinesisch bei der Benennung von Java-Variablen Feb 18, 2024 am 10:14 AM

Vor- und Nachteile der Verwendung von Chinesisch zur Benennung von Java-Variablen In der Java-Programmierung verwenden wir normalerweise Englisch, um Bezeichner wie Variablen, Methoden und Klassen zu benennen. Manchmal können wir jedoch auch die Verwendung von Chinesisch als Teil der Kennung in Betracht ziehen. In diesem Artikel werden die Vor- und Nachteile der Verwendung chinesischer benannter Java-Variablen untersucht und einige spezifische Codebeispiele aufgeführt. Vorteil 1: Verbessern Sie die Lesbarkeit des Codes. Durch die Verwendung chinesischer benannter Java-Variablen kann der Code leichter verständlich und lesbar gemacht werden. Schließlich versteht und erkennt unser Gehirn Chinesisch natürlicher und flüssiger als Englisch. Für Nicht-Englisch

Vergleich der Go-Sprache und Java hinsichtlich der Entwicklungseffizienz: Vergleich der Vor- und Nachteile Vergleich der Go-Sprache und Java hinsichtlich der Entwicklungseffizienz: Vergleich der Vor- und Nachteile Jan 31, 2024 pm 09:16 PM

Der Unterschied zwischen Go-Sprache und Java in der Entwicklungseffizienz: Überblick über Vor- und Nachteile Go-Sprache und Java sind beide beliebte Programmiersprachen und haben ihre eigenen Vor- und Nachteile. Auch in Bezug auf die Entwicklungseffizienz weisen Go-Sprache und Java unterschiedliche Leistungen auf. Die Vorteile der Go-Sprache sind einfach und leicht zu erlernen: Die Syntax der Go-Sprache ist einfach und leicht zu verstehen, und die Lernkurve ist gering. Dies macht die Go-Sprache ideal für Programmieranfänger oder Programmierer, die Projekte schnell entwickeln müssen. Schnelle Kompilierungsgeschwindigkeit: Die Kompilierungsgeschwindigkeit der Go-Sprache ist sehr hoch, wodurch sich die Go-Sprache sehr gut für schnelle Iterationen eignet.

See all articles