single.php

Chrome 拡張機能のNative Message機能でC#アプリから戻り値を受け取る方法

Google Chromeの拡張機能には Native Message 機能で実行させた外部プロセスから戻り値を受け取るまでの手順を備忘録的に投稿しておきます。

Native Messageで外部プログラムを実行

Chrome 拡張機能では外部のプログラムを実行できる Native Message 機能を利用が利用できます。

先回、C#のコンソールアプリを自作して Chrome拡張機能のアイコンをクリックしたイベントで実行させるための手順を紹介していきます。詳しい

詳しい内容は別記事をご覧ください。

先回紹介した、外部プログラムに値を受け渡す方法については別記事をご覧ください。

https://blog.janjan.net/2024/11/09/chrome-extension-execute-sharp-app-parameter-send/

外部プログラムから値を受け取る

先回は外部プログラムにJSON形式で値を受け渡す方法でしたが、今回はJSON形式で値を受け取る方法を行っていきます。

様々な方法が考えられますが、今回は “chrome.runtime.sendNativeMessage” を利用してパラメータをJSON形式で送信して、外部プログラムからJSON形式で戻り値を受け取る手順を紹介します。

先回作成した[NativeMessage]拡張機能を修整してパラメータの受け渡しができるようにします。

1. 必要なファイルとフォルダーを作成しておきます。(拡張子が無いのはフォルダー)

[NativeMessage]
|-[icons]
| |-[icon-48.png]
| |-[icon-128.png]
|-[manifest.json]
|-[background.js]

2.[background.js]を編集して次のJSONコードに修整して保存します。

'use strict';
{
  chrome.action.onClicked.addListener((tab) => {
     //chrome.runtime.connectNative('native.message.sample');
     chrome.runtime.sendNativeMessage(
      'native.message.sample',
      {param1:'Hello', param2:'World'},
      function(response, thread){
        console.log(response);
        return true;
      }
    );
  });

}

sendNativeMessage” では、第3引数で外部プログラムから値を受信できます。

今回は 受信した戻り値をデバッグ用のコンソールで表示しています。

3. C#アプリの “Program.cs” の末尾にJSON形式の戻り値を作成するための[Result]クラスを追加します。

public class Result
{
    public string? Message { get; set; }
}

4. “Program.cs” から戻り値を送信するためのSetData関数を追加します。

static void SetData(string Data)
{
    byte[] bytes = BitConverter.GetBytes(Data.Length);
    Stream openstdout = Console.OpenStandardOutput();
    for (int i = 0; i < 4; i++)
    {
        openstdout.WriteByte(bytes[i]);
    }
    byte[] b = Encoding.UTF8.GetBytes(Data);
    openstdout.Write(b, 0, b.Length);
    openstdout.Flush();
    openstdout.Close();

}

5. “Program.cs” の処理を変更して読み込んだ文字列を解析する処理を追加します。

Result res = new Result();
res.Message = "Hello";

string jsonString = JsonSerializer.Serialize(res);
SetData(jsonString);

6. Google Chromeで[拡張機能]ページで[ビューを検証]の[Service Worker]リンクをクリックしてから動作させます。

7. 表示された[Console]画面に受け取ったJSON形式の戻り値が表示されます。

“Program.cs” のすべてのコードは、こんな感じになります。

using System.Windows.Forms;
using System.Text.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.ToolTip;
using System.Text;
using static System.Runtime.InteropServices.JavaScript.JSType;
using System;

// See https://aka.ms/new-console-template for more information
//Console.WriteLine("Hello, World!");

string data = GetData();
Dictionary<string, string> dict = JsonSerializer.Deserialize<Dictionary<string, string>>(data);
foreach (string key in dict.Keys)
{
    MessageBox.Show("名前: " + key + " 値: " + dict[key]);
}

Result res = new Result();
res.Message = "Hello";

string jsonString = JsonSerializer.Serialize(res);
SetData(jsonString);

static void SetData(string Data)
{
    byte[] bytes = BitConverter.GetBytes(Data.Length);
    Stream openstdout = Console.OpenStandardOutput();
    for (int i = 0; i < 4; i++)
    {
        openstdout.WriteByte(bytes[i]);
    }
    byte[] b = Encoding.UTF8.GetBytes(Data);
    openstdout.Write(b, 0, b.Length);
    openstdout.Flush();
    openstdout.Close();
}

static string GetData()
{
    var openstdinput = Console.OpenStandardInput();
    var length = 0;
    var lengthBytes = new byte[4];
    openstdinput.Read(lengthBytes, 0, 4);
    length = BitConverter.ToInt32(lengthBytes, 0);

    string result = "";
    for (int i = 0; i < length; i++)
    {
        result += (char)openstdinput.ReadByte();
    }
    openstdinput.Close();
    return result;
}

public class Result
{
    public string? Message { get; set; }
}

Google Chromeから実行する際に[Invalid native messaging host name specified]エラーになる場合には、別記事をご覧ください。

まとめ

今回は、Google Chromeの拡張機能で Native Message 機能で外部プロセスから戻り値を受け取るまでの手順について紹介しました。

NativeMessageを利用するとC#などで作成した別アプリケーションをChrome拡張機能から実行できます。

その際に “chrome.runtime.sendNativeMessage” の第3引数を利用して外部プログラムからJSON形式で値を受け取ることが可能です。

Google Chrome 拡張機能で、別のアプリケーションを実行する際に戻り値を利用したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただきありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です