Native Messaging von der Chrome-Erweiterung zum nativen Host, geschrieben in C #
Ich versuche, eine Nachricht von meiner Chrome-Erweiterung über natives Messaging zu erhalten. Daspopup.html
console zeigt an, dass die Nachricht gesendet wird, aber mein Host sie aus irgendeinem Grund nicht empfängt. Ich kann sehen, dass der Hostnative.exe
wird im Task-Manager gestartet, aber der Host empfängt die gesendeten Daten nicht.
popup.js
document.addEventListener('DOMContentLoaded', function() {
var downloadButton= document.getElementById('Button');
downloadButton.addEventListener('click', function () {
chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
chrome.tabs.executeScript(tabs[0].id, {file: "myScript.js"}, function (data) {
sendNativeMessage(data[0]);
});
});
});
});
function sendNativeMessage(msg) {
var hostName = "com.google.example";
console.log("Connecting to host: " + hostName);
port = chrome.runtime.connectNative(hostName);
message = {"text": msg};
port.postMessage(message);
console.log("Sent message: " + JSON.stringify(message));
}
Wenn ich die Nachricht von meiner Chrome-Erweiterung aus sende, wird das Konsolenprotokoll für @ angezeigpopup.html
und die Nachricht ist korrekt.
Ich habe versucht, alles mit einem Code zu testen, von dem jemand behauptet hat, er habe funktionierNative Messaging Chrome. Insbesondere habe ich
native.exe
static void Main(string[] args) {
while (OpenStandardStreamIn() != null || OpenStandardStreamIn() != "")
{
Console.WriteLine(OpenStandardStreamIn());
}
}
private static string OpenStandardStreamIn()
{
//Read first four bytes for length information
System.IO.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;
}
Ich versuche immer noch, mich mit nativeMessaging zu beschäftigen, aber da ich sehe, dass die Nachricht über die Konsolenprotokolle gesendet wird, muss ich davon ausgehen, dass der Fehler bei meinem @ lieg.exe
. Ich habe den Registrierungsschlüssel HKCU erstellt und das @ des Hosts erstellmanifest.json
Datei. Da die Erweiterung das @ start.exe
, Ich bin mir ziemlich sicher, dass all das auch gut funktioniert.
Wenn jemand dabei helfen könnte, wäre das sehr dankbar. Vielen Dank
BEARBEITEN Nachdem ich absolut nichts geändert habe, kann ich mein @ nicht bekommnative.exe
von meiner Nebenstelle aus nicht mehr starten. Um dies zu beheben, habe ich versucht, meinen Absender so umzuschreiben, dass kein Port geöffnet wird:
...
chrome.tabs.executeScript(tabs[0].id, {file: "myScript.js"}, function (data) {
chrome.runtime.sendNativeMessage('com.google.example', {"text":data[0]}, function(response) {
if (chrome.runtime.lastError)
console.log("ERROR");
} else {
console.log("Response: " + response);
}
});
});
...
Das funktioniert auch gar nicht. Ich habe keine Ahnung, was ich falsch mache oder warum mein Gastgeber.exe
wurde nicht mehr gestartet, als ich eine Nachricht von meiner Nebenstelle gesendet habe.
EDIT # 2
Gute Nachrichten
Ich habe meinen Registrierungsschlüssel gelöscht und ihn dann erneut in die Registrierung des lokalen Computers (d. H. HKLM) eingefügt. Wieder habe ich den Code von @ verwendNative Messaging Chrome zum Senden und Empfangen von meinem Host. Wenn ich jetzt das Protokoll meiner Erweiterung betrachte, kann ich die richtige Antwort von meinem Host sehen. Ich benutze die "no-port" -Methode, indem ich einfach @ aufruchrome.runtime.sendNativeMessage(...)
, was für meine Zwecke in Ordnung ist. Leider erhalte ich keine Nachricht von der Nebenstelle an den Host. Auch meinhost.exe
wird nie beendet, auch wenn die Nachricht empfangen wurde. Ich bin mir nicht sicher warum, aber wenn jemand helfen kann, würde ich es begrüßen.
Ich versuche auf meinem Host, die eingehende Nachricht in eine Datei zu schreiben, um zu testen, ob ich die Nachricht erhalte:
System.IO.File.WriteAllText(@"path_to_file.txt", OpenStandardStreamIn());
Hinweis: Die Nachricht, die ich von der Nebenstelle an den Host weitergebe, ist ungefähr 250 KB groß (variiert von Nachricht zu Nachricht).
Das Problem ist
Nothing wird in die Datei geschrieben. Es ist völlig leer.Die Erstellung der Datei dauert sehr lange (~ 4 Sekunden).Myhost.exe
Instanz wird nie beendet. Es läuft noch (ich kann es im Task-Manager anzeigen).