2017-03-28 1 views
4

Ich habe zwei verschiedene ausführbare Dateien auf demselben Computer, der Windows OS hat. Beide sind in Unity gebaut. Ich möchte eine Nachricht von einem anderen senden, ohne das Netzwerk zu verwenden.Sende eine Nachricht von einem Programm zu einem anderen in Unity

Wie senden Sie eine Nachricht von einem EXE-Programm an ein anderes EXE-Programm in Unity?

Ist dies mit integrated Mono/.net functionality oder etwas anderes möglich?

+0

Ramdisk ist schnell –

Antwort

7

geschrieben wurde Sie Named Pipes verwenden können die gemeinsam genutzten Speicher verwendet, um mit einer anderen Anwendung auf die-gleiche Maschine zu kommunizieren.

Zum Datei ->Build-Einstellungen ... wählen PC, Mac & Linux Standalone dann auf Player-Einstellungen .... Ändern Sie jetzt Api-Kompatibilitätsstufe zu .NET 2.0.

Schließen Sie Visual Studio und öffnen Sie es erneut. Jetzt können Sie using System.IO.Pipes; importieren und NamedPipeServerStream und verwenden können.

Unten ist ein sehr vereinfacht Server und Client. Sie müssen tun, dass in einem Thread und sollte auch Ausnahme behandeln.

Wenn Sie nicht Thread verwenden möchten, gibt es auch einen asynchronen Parameter(), der es zu einem nicht blockierenden Operator macht. Es wird kompliziert von dort und Sie müssen dafür einige Beispiele für MS Doc suchen.

Simple Server:

//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(); 

Simple Client:

//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(); 

Die StreamString Klasse von MS Doc:

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; 
    } 
} 
+1

Vielen Dank! Dies ist die Lösung, nach der ich gesucht habe – mcelik

+0

Ich habe den von Ihnen bereitgestellten Code implementiert. Aber es wirft diesen Fehler: NotImplementedException: ACL wird nicht unterstützt in Mono Ich suchte nach einer Lösung, konnte aber keine Antwort finden. – mcelik

+0

Sie laufen das auf Windows, oder? Bitte beginnen Sie von unten nach oben zu kommentieren, um zu sehen, welche Codezeile diesen Fehler verursacht. – Programmer

1

Sie könnten eine Datei haben, die sie schreiben und lesen. Sie können einen Zeitstempel damit abfinden zu zeigen, wenn die letzte Nachricht

+1

Klingt gut, aber schlecht, wenn Sie dies wiederholt auf einer SSD tun. – Programmer

+0

True @Programmer Sie könnten wie eine Datenbank verwenden, die Sie Zeilen mit einer Nachrichtenspalte hinzufügen, aber das ist eine Menge Arbeit für eine sehr kleine Sache –

+2

Jahr. Jede Datenbank, die RAM für den Speicher verwendet, sollte dies tun. Ich denke, es gibt wenige da draußen. Obwohl, das ist wie Wasser mit einem Eimer trinken. – Programmer

Verwandte Themen