我有两个不同的可执行文件在运行Windows操作系统的同一台计算机上运行。他们都是在Unity中构建的。我想从一个发送消息到其他而不使用网络。在Unity中将消息从一个程序发送到另一个程序
如何从EXE程序发送消息到Unity中的另一个EXE程序?
这可能与integrated Mono/.net functionality
或其他?
我有两个不同的可执行文件在运行Windows操作系统的同一台计算机上运行。他们都是在Unity中构建的。我想从一个发送消息到其他而不使用网络。在Unity中将消息从一个程序发送到另一个程序
如何从EXE程序发送消息到Unity中的另一个EXE程序?
这可能与integrated Mono/.net functionality
或其他?
您可以使用命名管道它采用共享内存的,同一机上与其他应用程序进行通信。
转到文件 - >构建设置...选择PC,苹果机& Linux的独立然后点击播放器设置...。现在,将Api兼容级别更改为.NET 2.0。
关闭并重新打开Visual Studio。现在,您可以导入using System.IO.Pipes;
并能够使用NamedPipeServerStream
和NamedPipeClientStream
。
下面是一个非常简单的服务器和客户端。你必须在Thread
做到这一点,也应该处理异常。
如果您不想使用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;
}
}
谢谢!这是我正在寻找的解决方案 – mcelik
我实施了您提供的代码。但它引发此错误: NotImplementedException:单声道不支持ACL 我搜索了一个解决方案,但找不到答案。 – mcelik
你正在windows上运行这个,对吧?请从下往上开始评论以查看哪一行代码导致了该错误。 – Programmer
你可以有一个文件,他们都写和读。 你可以把一个时间戳与它表明,当最后的消息写入
当您在SSD上反复执行此操作时听起来不错但很糟糕。 – Programmer
True @Programmer你可以像使用一个数据库那样使用一个消息列来添加行,但对于一件非常小的事情来说这是相当多的工作 –
Year。任何使用RAM进行存储的数据库都应该这样做。我认为那里几乎没有。虽然,这就像喝桶水一样。 – Programmer
Ramdisk是一个快速 –