встроенное сообщение расширения chrome не получено в приложении c #

#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:

Теперь я могу общаться. Что я изменил, так это

  1. Создано приложение Windows form как собственное приложение, ранее это было консольное приложение. Не знаю, почему, но расширение не может взаимодействовать с консольным приложением.
    1. Вместо запуска .bat из json запустите прямое встроенное приложение.