#google-chrome #native #communication
#google-chrome #встроенное #Информационные материалы
Вопрос:
Я пытаюсь установить связь между расширением Chrome и приложением c # с помощью встроенного обмена сообщениями. Я сослался на ссылку nativeMessaging
В моем расширении есть 2 кнопки меню, одна для connectnative, а другая для postmessage.
Когда я нажимаю на подключение собственного приложения моего хоста c # (app.exe ) запускается. Но после нажатия на postmessage сообщение не получено в app.exe .
Ниже приведены примеры кодов
com.ln.json
{
"name": "com.ln",
"description": "Chrome Native Messaging API Example Host",
"path": "app.bat",
"type": "stdio",
"allowed_origins":
[
"chrome-extension://hplkgmmknmccnfalidkjhkponfakmhag/"
]
}
menupopup.js
var port=null;
chrome.browserAction.onClicked.addListener(LinguifyOnClick());
function MenuButtonClicked(evnt)
{
try
{
var menuId = evnt.target.id;
if(menuId == "0")
{
Communicate();
}
if(menuId == "1")
{
SendPostMessage();
}
window.close();
}
catch(err)
{
}
}
function LinguifyOnClick()
{
try
{
//var BodyTag = document.getElementsByTagName("body");
var DefaultTag = document.getElementById("DefaultUl");
for (iCtr = 0; iCtr<3; iCtr )
{
var tmpTag = document.createElement("li");
tmpTag.id = iCtr.toString();
tmpTag.className = iCtr.toString();
if(iCtr==0)
{
tmpTag.innerHTML = " ConnectToNativeHost";
}
else if(iCtr==1)
{
tmpTag.innerHTML = " SendPostMessage";
}
DefaultTag.appendChild(tmpTag);
tmpTag.addEventListener('click', MenuButtonClicked);
}
}
catch(err)
{
}
}
function SendPostMessage()
{
var message = {"text" : "PostMessageSent_EXT"};
alert("SendPostMessage=" port JSON.stringify(message));
port.postMessage(message);
alert("SendPostMessage=" JSON.stringify(message));
}
function Communicate()
{
port = chrome.runtime.connectNative('com.ln');
//port = chrome.extension.connectNative('com.ln');
port.onMessage.addListener(function(msg)
{
alert("Received from native app:1 =" msg);
});
port.onDisconnect.addListener(function()
{
alert("Disconnected");
});
}
app.exe (код на c #)
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace sign
{
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)
{
try
{
var message = data["message"].Value<string>();
switch (message)
{
case "test":
return "testing!";
case "exit":
return "exit";
default:
return "echo: " message;
}
}
catch (Exception ex)
{
Console.Write("ProcessMessage =" ex.Message);
}
return " ";
}
public static JObject Read()
{
try
{
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));
}
catch (Exception ex)
{
Console.Write("Read =" ex.Message);
}
return null;
}
public static void Write(JToken data)
{
try
{
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) amp; 0xFF));
stdout.WriteByte((byte)((bytes.Length >> 8) amp; 0xFF));
stdout.WriteByte((byte)((bytes.Length >> 16) amp; 0xFF));
stdout.WriteByte((byte)((bytes.Length >> 24) amp; 0xFF));
stdout.Write(bytes, 0, bytes.Length);
stdout.Flush();
}
catch (Exception ex)
{
Console.Write("Write =" ex.Message);
}
}
}
}
Ответ №1:
Теперь я могу общаться. Что я изменил, так это
- Создано приложение Windows form как собственное приложение, ранее это было консольное приложение. Не знаю, почему, но расширение не может взаимодействовать с консольным приложением.
- Вместо запуска .bat из json запустите прямое встроенное приложение.