我正在使用命名管道與進程進行通信。我已經能夠使它與以下代碼一起工作。 (原始代碼在這裏找到:via archive.org)C#命名管道而不從控制檯發出命令?
class ProgramPipeTest
{
public void ThreadSenderStartClient(object obj)
{
// Ensure that we only start the client after the server has created the pipe
ManualResetEvent SyncClientServer = (ManualResetEvent)obj;
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".","ToSrvPipe",PipeDirection.Out,PipeOptions.None))
{
// The connect function will indefinately wait for the pipe to become available
// If that is not acceptable specify a maximum waiting time (in ms)
pipeStream.Connect();
Console.WriteLine("[Client] Pipe connection established");
using (StreamWriter sw = new StreamWriter(pipeStream))
{
sw.AutoFlush = true;
string temp;
Console.WriteLine("Please type a message and press [Enter], or type 'quit' to exit the program");
while ((temp = Console.ReadLine()) != null)
{
if (temp == "quit") break;
sw.WriteLine(temp);
}
}
}
}
public void ThreadStartReceiverClient(object obj)
{
// Ensure that we only start the client after the server has created the pipe
ManualResetEvent SyncClientServer = (ManualResetEvent)obj;
using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(".", "FromSrvPipe", PipeDirection.In, PipeOptions.None))
{
// The connect function will indefinately wait for the pipe to become available
// If that is not acceptable specify a maximum waiting time (in ms)
pipeStream.Connect();
Console.WriteLine("[ClientReceiver] Pipe connection established");
using (StreamReader sr = new StreamReader(pipeStream))
{
// Display the read text to the console
string temp;
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("Received from server: {0}", temp);
}
}
}
}
static void Main(string[] args)
{
// To simplify debugging we are going to create just one process, and have two tasks
// talk to each other. (Which is a bit like me sending an e-mail to my co-workers)
ProgramPipeTest Client = new ProgramPipeTest();
Thread ClientThread = new Thread(Client.ThreadSenderStartClient);
Thread ReceivedThread = new Thread(Client.ThreadStartReceiverClient);
ClientThread.Start();
ReceivedThread.Start();
}
}
一切都按預期工作。我能夠向我的目標進程發出命令(大膽)。我的問題是,我基本上想圍繞此代碼包裝C#GUI,但不知道如何修改它,以便通信完成而無需使用控制檯,因爲命令將通過GUI發出或來自代碼。
我試圖打開StreamWriter的SW到類變量,通過屬性暴露它,並用一個方法調用sw.WriteLine(),但似乎並沒有工作。
所以我不能確定如何將流封裝對象中來回很好。
我發現這篇文章看起來像是現貨,Using Named Pipes to Connect a GUI to a Console App in Windows,但不幸的是它似乎並沒有附帶任何代碼,並且沒有任何引用。
那麼,如何使用命名管道,而無需使用控制檯發出的命令?
上帝保佑你。驚人!這工作完美無瑕。 我做了添加在構造函數中附加參數以來的要在另一pipeName和從管道未命名相同的唯一變化。 – bulltorious
LOL,我不確定它有多完整 - 但它本意是成爲未來問題的準則。很高興它解決了! – Ani