从 chrome 扩展程序到用 C# 编写的本机主机的本机消息传递
本文关键字:本机 主机 消息传递 扩展 chrome 程序 | 更新日期: 2023-09-27 18:35:11
我正在尝试通过本机消息接收来自chrome扩展程序的消息。popup.html
控制台指示正在发送消息,但由于某种原因,我的主机未收到消息。我可以看到主机native.exe
正在任务管理器中启动,但主机没有收到发送的数据。
弹出窗口.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));
}
现在,当我从Chrome扩展程序发送消息时,我可以看到popup.html
的控制台日志,并且消息正确。
我试图通过使用一些有人声称已经工作的代码来测试所有内容,这些代码来自原生消息传递Chrome。具体来说,我有
本地人.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;
}
我仍在尝试围绕本机消息传递,但是由于我可以看到通过控制台日志发送的消息,因此我必须假设错误与我的.exe
有关。我已经创建了注册表项 HKCU,并创建了主机的manifest.json
文件。由于扩展程序正在启动.exe
,我很确定所有这些都可以正常工作。
如果有人能在这方面提供一些帮助,将不胜感激。谢谢!
编辑:在绝对没有更改任何东西之后,我无法再从我的扩展启动我的native.exe
。为了解决这个问题,我尝试重写我的发送程序以不打开端口:
...
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);
}
});
});
...
这也根本行不通。我不知道我做错了什么,也不知道为什么当我从扩展发送消息时,我的主机.exe
停止启动。
编辑#2
好消息!
我删除了注册表项,然后再次将其添加到本地计算机注册表(即 HKLM)中。同样,我使用来自原生消息Chrome的代码从我的主机发送和接收。现在,当我查看扩展的日志时,我可以看到来自主机的正确响应。我通过简单地调用chrome.runtime.sendNativeMessage(...)
来使用"无端口"方法,这对我的目的来说很好。不幸的是,我没有收到从扩展到主机的消息。此外,即使在收到消息后,我的host.exe
也不会退出。我不知道为什么,但如果有人能帮忙,我将不胜感激。
在我的主机中,我尝试将传入消息写入文件,只是为了测试我是否收到消息:
System.IO.File.WriteAllText(@"path_to_file.txt", OpenStandardStreamIn());
注意:我从扩展程序传递到主机的消息约为250KB(因消息而异)。
问题是:
- 不会向文件写入任何内容。它完全是空白的。
- 创建文件需要很长时间(~4 秒)。
- 我的
host.exe
实例永远不会终止。它仍在运行(我可以在任务管理器中查看它)。
为了使我的扩展正常工作,我遵循以下步骤:
- 我删除了我的注册表项,然后将其重新添加到我的 HKLM 注册表中。
-
虽然没有必要,但
host.exe
实际上只需要从扩展接收一条消息,所以我将之前的"开放端口"消息更改为"无端口"消息,即chrome.runtime.sendNativeMessage(...);
-
重要的是,当我将发送的文本从
{"text":data[0]}
更改为简单的字符串{"text":"Hello from Chrome!"}
时,一切都开始顺利进行。data[0]
是一个大约 250KB 的字符串,根据开发人员的网站,这绝对应该是可接受的消息大小。但是,我为这个问题创建了一个不同的问题,因为我能够解决我遇到的一般消息发送和接收问题。