2015-06-17 26 views
19

Bugün Chrome yerel mesajlaşma işleminin bir C# ana anasistemiyle nasıl çalıştığı konusunda araştırma yapmak için birkaç saat harcadım. Kavramsal olarak oldukça basit, ama bu sorulardan I (kısmen) yardımıyla çözülmesi birkaç kırılmaların vardı:C# yerel anasistem

Native Messaging Chrome
Native messaging from chrome extension to native host written in C#
Very Slow to pass "large" amount of data from Chrome Extension to Host (written in C#)

Çözümümün aşağıda nakledilir.

cevap

24

burada "port" yöntemini kullanarak bir C# konak konuştuğu için tam bir örnektir, tezahür uygun şekilde ayarlandığında varsayarsak:

using System; 
using System.IO; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace NativeMessagingHost 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
     JObject data; 
     while ((data = Read()) != null) 
     { 
      var processed = ProcessMessage(data); 
      Write(processed); 
      if (processed == "exit") 
      { 
       return; 
      } 
     } 
     } 

     public static string ProcessMessage(JObject data) 
     { 
     var message = data["text"].Value<string>(); 
     switch (message) 
     { 
      case "test": 
       return "testing!"; 
      case "exit": 
       return "exit"; 
      default: 
       return "echo: " + message; 
     } 
     } 

     public static JObject Read() 
     { 
     var stdin = Console.OpenStandardInput(); 
     var length = 0; 

     var lengthBytes = new byte[4]; 
     stdin.Read(lengthBytes, 0, 4); 
     length = BitConverter.ToInt32(lengthBytes, 0); 

     var buffer = new char[length]; 
     using (var reader = new StreamReader(stdin)) 
     { 
      while (reader.Peek() >= 0) 
      { 
       reader.Read(buffer, 0, buffer.Length); 
      } 
     } 

     return (JObject)JsonConvert.DeserializeObject<JObject>(new string(buffer)); 
     } 

     public static void Write(JToken data) 
     { 
     var json = new JObject(); 
     json["data"] = data; 

     var bytes = System.Text.Encoding.UTF8.GetBytes(json.ToString(Formatting.None)); 

     var stdout = Console.OpenStandardOutput(); 
     stdout.WriteByte((byte)((bytes.Length >> 0) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 8) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 16) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 24) & 0xFF)); 
     stdout.Write(bytes, 0, bytes.Length); 
     stdout.Flush(); 
     } 
    } 
} 

aktif ana bilgisayarla iletişim kurmak için ihtiyacınız yoksa, runtime.sendNativeMessage kullanarak iyi çalışır. Ev sahibinin asılı kalmasını önlemek için, while döngüsünü kaldırın ve Okuma/Yazma işlemini bir kez yapın. https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging

Not:

Bunu test etmek için, burada Google tarafından sağlanan örnek projeyi kullanılan ben json seri/de-serileştirme sürecini kolaylaştırmak için Json.NET kullanıyorum.

Umarım bu birilerine yardımcı olur!

+0

Java için bunu araştırıyorum ama hiçbir yerde bulamıyorum:/ – farukdgn

+0

@farukdgn Özellikle, bulunması zor olan nedir? Bir Java uygulaması oldukça benzer olmalıdır. – itslittlejohn

+0

Yup, teşekkürler bu mükemmel bir başlangıç! – shaune

İlgili konular