これは私の最初の質問なので、できるだけ詳しく説明します。現在、C で記述された別のプログラム (StringGen と呼びます) をテストする C# プログラム (TestProgram と呼びます) に取り組んでいます。TestProgram は、コマンド ウィンドウで StringGen を実行し、一連の入力文字列を入力して、それぞれの出力を記録することになっています。StringGen が実行されると、入力を待機する while ループが開始され、その入力が処理関数に送信され、結果が返されます。
私の問題は、TestProgram に文字列を StringGen に送信させようとしたときに発生します。StringGen をプロセスとして開始し、Process.StandardInput.WriteLine() で入力をフィードしようとしてから、Process.StandardOutput.ReadLine() で出力を探しています。さらに詳しく説明する前に、いくつかのコードを提供します。
StringGen のメイン関数は次のとおりです。
int main() {
char result[255];
char input[255];
do {
fgets(input, 100, stdin);
result = GetDevices(input); //Returns the string required
printf("%s", result);
} while (input != "quit");
return 0;
}
StringGen をプロセスとして定義する C# コードを次に示します。
Process cmd = new Process();
ProcessStartInfo info = new ProcessStartInfo(command, arguements); // Command is the path to the C executeable for StringGen
info.WorkingDirectory = workingDirectory; // Working Directory is the directory where Command is stored
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
cmd.StartInfo = info;
cmd.Start();
次に、このプロセスを次のように使用します。
using (var cmd)
{
// Loop through the input strings
String response;
foreach (exampleString in StringSet) // Loops through each string
{
cmd.StandardInput.WriteLine(exampleString.text); // This is the problem line
response = cmd.StandardOutput.ReadLine(); // System comes to a halt here
cmd.StandardOutput.Close();
if (response == "Something")
{
// Do this
}
else
{
// Do that
}
}
}
WriteLine コマンドは StringGen に入力を与えていないようで、StringGen が出力を返さないため、システムは ReadLine でハングします。コマンドラインで StringGen を実行してみましたが、正常に動作し、キーボードからの入力を受け取り、正しい文字列を出力します。私は考えられるすべてを試し、このサイトや解決策を見つけようとして他の人を検索しましたが、この種のコードのすべての例は他の人にとってはうまくいくようです. 何が間違っているのかわかりません。TestProgram から StringGen プログラムに入力を送信する方法を誰かが提案できれば、本当に感謝しています。重要なことを省略したり、不明な点があればお知らせください。
注: StringGen で scanf と fgets の両方を試しましたが、どちらも同じ結果になります。
WriteLine() でリテラル文字列を使用しようとしましたが、まだ入力がありません。
TestProgram で Write() と Flush() を使用しようとしましたが、役に立ちませんでした。
フラッシュを強制するために入力バッファを Close() しようとしましたが、これも効果がありません。
StringGen でテストを実行するために他の誰かのコードを編集しているため、C# にはあまり詳しくありません。