在Unity中将消息从一个程序发送到另一个程序

我有两个不同的可执行文件在同一台运行Windows OS的计算机上运行。 它们都是在Unity中构建的。 我想在不使用网络的情况下将消息从一个发送到另一个。

如何从exe程序向Unity中的另一个exe程序发送消息?

这是integrated Mono/.net functionality还是其他integrated Mono/.net functionality吗?

您可以使用命名管道 ,它使用共享内存与同一台计算机上另一个应用程序进行通信。

转到文件 – > 构建设置…选择PC,Mac和Linux Standalone,然后单击播放器设置…. 现在,将Api兼容级别更改为.NET 2.0

关闭并重新打开Visual Studio。 现在,您可以using System.IO.Pipes;导入using System.IO.Pipes; 并能够使用NamedPipeServerStreamNamedPipeClientStream

下面是一个非常简化的服务器和客户端。 您必须Thread执行此操作,并且还应处理exception。

如果您不想使用Thread ,还有异步参数( PipeOptions.Asynchronous )使其成为非阻塞运算符。 它从那里变得复杂,你必须在MS doc上寻找一些例子。

简单服务器

 //Create Server Instance NamedPipeServerStream server = new NamedPipeServerStream("MyCOMApp", PipeDirection.InOut, 1); //Wait for a client to connect server.WaitForConnection(); //Created stream for reading and writing StreamString serverStream = new StreamString(server); //Send Message to Client serverStream.WriteString("Hello From Server"); //Read from Client string dataFromClient = serverStream.ReadString(); UnityEngine.Debug.Log("Received from Client: " + dataFromClient); //Close Connection server.Close(); 

简单客户

 //Create Client Instance NamedPipeClientStream client = new NamedPipeClientStream(".", "MyCOMApp", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation); //Connect to server client.Connect(); //Created stream for reading and writing StreamString clientStream = new StreamString(client); //Read from Server string dataFromServer = clientStream.ReadString(); UnityEngine.Debug.Log("Received from Server: " + dataFromServer); //Send Message to Server clientStream.WriteString("Bye from client"); //Close client client.Close(); 

来自MS Doc的StreamString类:

 public class StreamString { private Stream ioStream; private UnicodeEncoding streamEncoding; public StreamString(Stream ioStream) { this.ioStream = ioStream; streamEncoding = new UnicodeEncoding(); } public string ReadString() { int len = 0; len = ioStream.ReadByte() * 256; len += ioStream.ReadByte(); byte[] inBuffer = new byte[len]; ioStream.Read(inBuffer, 0, len); return streamEncoding.GetString(inBuffer); } public int WriteString(string outString) { byte[] outBuffer = streamEncoding.GetBytes(outString); int len = outBuffer.Length; if (len > UInt16.MaxValue) { len = (int)UInt16.MaxValue; } ioStream.WriteByte((byte)(len / 256)); ioStream.WriteByte((byte)(len & 255)); ioStream.Write(outBuffer, 0, len); ioStream.Flush(); return outBuffer.Length + 2; } } 

你可以有一个他们写和读的文件。 您可以使用时间戳来显示最后一条消息的写入时间