我今天花了几个小时研究如何让Chrome本地消息与C#本地主机配合工作。概念上很简单,但是有一些问题,我在这些其他问题的帮助下得到了解决:
Native Messaging Chrome
从Chrome扩展程序到使用C#编写的本地主机的本地消息传递
从Chrome扩展程序向主机(使用C#编写)传递“大量”数据非常缓慢
我的解决方案如下。
我今天花了几个小时研究如何让Chrome本地消息与C#本地主机配合工作。概念上很简单,但是有一些问题,我在这些其他问题的帮助下得到了解决:
Native Messaging Chrome
从Chrome扩展程序到使用C#编写的本地主机的本地消息传递
从Chrome扩展程序向主机(使用C#编写)传递“大量”数据非常缓慢
我的解决方案如下。
假设清单已正确设置,以下是使用“端口”方法与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<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();
}
}
}
如果您不需要主动与主机通信,使用runtime.sendNativeMessage
即可。为了防止主机挂起,只需删除while
循环并进行一次读/写操作。
为了测试这个功能,我使用了Google提供的示例项目:https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging
注意:我使用Json.NET来简化JSON序列化/反序列化过程。
希望这对某些人有所帮助!
您也可以使用常规的http通信。并使用fetch或其他js api发送消息。主机应用程序将是在本地主机上运行的常规Web API项目。您还需要在Web应用程序中启用CORS策略。对于某些情况来说可能有点过度,而且可能不太快。但对于大多数开发人员来说更透明,并且在我的项目中表现出色。