带有Chrome Native Messaging的C#本机主机

我今天花了几个小时研究如何让Chrome本机消息传递与C#本机主机一起工作。 从概念上讲,这很简单,但是我解决了一些障碍,我在这些其他问题的帮助下(部分)解决了这个障碍:

原生消息Chrome
从chrome扩展到用C#编写的本机主机的本机消息传递
将“大量”数据从Chrome扩展程序传递到主机(用C#编写)非常慢

我的解决方案发布在下面。

假设清单已正确设置,以下是使用“port”方法与C#主机通信的完整示例:

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

如果您不需要主动与主机通信,则使用runtime.sendNativeMessage将正常工作。 要防止主机挂起,只需删除while循环并执行一次读/写操作。

为了测试这个,我使用了谷歌提供的示例项目: https : //chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging

注意:我正在使用Json.NET来简化json序列化/反序列化过程。

我希望这对某人有帮助!