日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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;

登錄后復制

分享到:
標簽:跨平臺應用
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定