single.php

Chrome 拡張機能の実行時に[Unchecked runtime.lasterror: Native host has exited]が表示される場合の対処法

Google Chromeの拡張機能で外部プログラムを実行するNative Messageを実行した際に[Unchecked runtime.lasterror: Native host has exited]が表示される場合の対処法について備忘録的に投稿しておきます。

[Native host has exited]エラー

外部プログラムを実行するNativeMessageを実行した際に、Google Chromeの[拡張機能]画面でエラー表示[Unchecked runtime.lasterror: Native host has exited]が表示される場合があります。

原因と対処法

[Unchecked runtime.lasterror: Native host has exited]のエラーメッセージを

エラーになる原因を特定するのは結構難しくて、呼び出し側のJavaScriptなのか外部プログラム側なのか判断が付かない場合があります。

“Native host has exited” を直訳すると、”ネイティブホストが終了しました” となり要するに「拡張機能として呼び出した外部プログラムが予期せず終了してしまった」というエラーになります。

今回は、私が Chrome用の機能拡張を制作する際に実際に解決した部分を紹介していきます。

[postMessage]ではなく[sendNativeMessage]を使う

検索して記事に記載されている以下のような[connectNative]で取得した戻り値に[postMessage]でパラメータなどを引き渡した場合にエラーになる場合があります。

例えば、以下のようなコードの場合にエラーになる場合があります。

var port = chrome.runtime.connectNative('native.message.sample');
port.postMessage({param1:'Hello', param2:'World!'});

[postMessage]を使わずに[sendNativeMessage]に変更してエラーを改善できました。

chrome.runtime.sendNativeMessage(
    'native.message.sample',
    {param1:'Hello', param2:'World!'}
);

戻り値を受け取る処理の追加

NativeMessageで呼び出したプログラム内から値を送信している場合には[sendNativeMessage]の引数で受け取る必要があります。

例えば、次のようなコードでC#アプリからJSON形式で値を出力している場合には[sendNativeMessage]側で受け取る用意が無い場合にエラーになる場合があります。

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

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

[sendNativeMessage]で戻り値を受け取るパラメータを追加してエラーを改善できました。

try {

  chrome.runtime.sendNativeMessage(
    'native.message.sample',
    {param1:'Hello', param2:’World!’},
    errorHandle(function(response, thread){
      console.log(response);
      return true;
    }
  ));

} catch (error) {
  console.log(error.response);
}

function errorHandle(process) {
  return function(){
    try {
      return process.apply(this, arguments);
    } catch (e) {
      console.error(e);
    }
  };
}

戻り値を正しく返却

Native Message機能で、外部プログラム(例はC#)では受け渡された値や返却する値にバイナリとして処理する必要があります。

そのため、アプリ起動時と終了時に入出力を処理する際にバイト配列として値を扱う必要があります。

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;
}
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();
}

この他にも[Unchecked runtime.lasterror: Native host has exited]エラーが表示される場合は多々ありますが、私がChrome拡張機能を制作する中で、解決できた部分を紹介してみました。

まとめ

今回は、Google Chromeの拡張機能で外部プログラムを実行するNative Messageを実行した際に[Unchecked runtime.lasterror: Native host has exited]が表示される場合の対処法について書きました。

[Unchecked runtime.lasterror: Native host has exited]エラーの原因は多岐に渡るようで、検索すると数々の改善する方法の記事に当たります。

個人的には、外部プログラムと受け渡す値(引数や戻り値)の部分でエラーを引き起こしている部分が多い感じを受けました。

Google Chromeの拡張機能で[Unchecked runtime.lasterror: Native host has exited]エラーが表示されている人の参考になれば幸いです。

スポンサーリンク

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

コメントを残す

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