C# собственный хост с Chrome Native Messaging
Сегодня я потратил несколько часов на то, чтобы заставить нативную систему обмена сообщениями Chrome работать с нативным хостом C#. Концептуально это было довольно просто, но было несколько проблем, которые я решил с помощью (частично) следующих вопросов:
Native Messaging Chrome
Собственный обмен сообщениями от расширения Chrome до собственного хоста, написанного на C#
Очень медленно для передачи "большого" объема данных из расширения Chrome на хост (написанный на C#)
Мое решение размещено ниже.
2 ответа
Предполагая, что манифест настроен правильно, вот полный пример общения с хостом C# с использованием метода "port":
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. И хост-приложение будет обычным проектом веб-API, который работает на локальном хосте. Вам также потребуется включить политику cors в веб-приложении. Может быть, это излишне для некоторых случаев и, вероятно, не так быстро. Но он более прозрачен для большинства разработчиков и прекрасно работает в моем проекте.