带有 Chrome Native Messaging 的 C# 本机主机 [英] C# native host with Chrome Native Messaging
问题描述
我今天花了几个小时研究如何让 Chrome 本地消息传递与 C# 本地主机一起工作.从概念上讲,这很简单,但我在这些其他问题的帮助下(部分)解决了一些问题:
I spent a few hours today researching how to get Chrome native messaging working with a C# native host. Conceptually it was quite simple, but there were a few snags that I resolved with help (in part) from these other questions:
本机消息传递 Chrome
从chrome扩展到本地主机的本地消息传递用 C# 编写
通过很慢大"从 Chrome 扩展程序到主机的数据量(用 C# 编写)
我的解决方案发布在下面.
My solution is posted below.
推荐答案
假设清单设置正确,以下是使用端口"方法与 C# 主机对话的完整示例:
Assuming the manifest is set up properly, here is a complete example for talking to a C# host using the "port" method:
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
循环并执行一次读/写.
If you don't need to actively communicate with the host, using runtime.sendNativeMessage
will work fine. To prevent the host from hanging, simply remove the while
loop and do Read/Write once.
为了测试这一点,我使用了谷歌在此处提供的示例项目:https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging
To test this, I used the example project provided by Google here: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging
注意:我使用 Json.NET 来简化 json 序列化/反序列化过程.
Note: I'm using Json.NET to simplify the json serialization/de-serialization process.
我希望这对某人有帮助!
I hope this is helpful to somebody!
这篇关于带有 Chrome Native Messaging 的 C# 本机主机的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!