Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
725 views
in Technique[技术] by (71.8m points)

c# - Native Messaging Chrome

I am trying to get Native Messaging between my chrome extension and my c# application. The javascript works fine, but I am getting this error:

Error when communicating with the native messaging host.

The application does get launched along with the extension, as I saw from Task Manager. Here is my c# code.

private static string OpenStandardStreamIn()
{
    //// We need to read first 4 bytes for length information
    Stream stdin = Console.OpenStandardInput();
    int length = 0;
    byte[] bytes = new byte[4];
    stdin.Read(bytes, 0, 4);
    length = System.BitConverter.ToInt32(bytes, 0);

    string input = "";
    for (int i = 0; i < length;i++ )    
    {
        input += (char)stdin.ReadByte();
    }

    return input;  
}

private static void OpenStandardStreamOut(string stringData)
{
    //// We need to send the 4 btyes of length information
    string msgdata = "{"text":"" + stringData + ""}";
    int DataLength = stringData.Length;
    Stream stdout = Console.OpenStandardOutput();
    stdout.WriteByte((byte)((DataLength >> 0) & 0xFF));
    stdout.WriteByte((byte)((DataLength >> 8) & 0xFF));
    stdout.WriteByte((byte)((DataLength >> 16) & 0xFF));
    stdout.WriteByte((byte)((DataLength >> 24) & 0xFF));
    //Available total length : 4,294,967,295 ( FF FF FF FF )
    Console.Write(msgdata);
}

And the main function:

static void Main(string[] args)
{
    string message = "test message from native app.";
    OpenStandardStreamOut(message);

    while (OpenStandardStreamIn() != null || OpenStandardStreamIn() != "")
    {
        OpenStandardStreamOut("Received to Native App: " + OpenStandardStreamIn());
        OpenStandardStreamOut("Recieved: " + OpenStandardStreamIn());  
    }
}

JS Code:

var host_name = "com.example.native";
var port = null;

connectToNative();
function connectToNative() {
    console.log('Connecting to native host: ' + host_name);
    port = chrome.runtime.connectNative(host_name);
    port.onMessage.addListener(onNativeMessage);
    port.onDisconnect.addListener(onDisconnected);
    sendNativeMessage("test");
}

function sendNativeMessage(msg) {
    message = {"text" : msg};
    console.log('Sending message to native app: ' + JSON.stringify(message));
    port.postMessage(message);
    console.log('Sent message to native app: ' + msg);
}

function onNativeMessage(message) {
    console.log('recieved message from native app: ' + JSON.stringify(msg));
}

function onDisconnected() {
    console.log(chrome.runtime.lastError);
    console.log('disconnected from native app.');
    port = null;
}

Host Manifest:

{
  "name": "com.example.native",
  "description": "Native support for Chrome Extension",
  "path": "NativeApp.exe",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://ajfkjfmkedgcgdckdkmppfblonpeench/"
  ]
}  
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Yeah that's because you send a wrong data length. Change stringData.Length to msgdata.Length in your OpenStandardStreamOut function.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...