我有兩個不同的可執行文件在運行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是一個快速 –