6

C#アプリケーションと拡張機能の間で通信できるブリッジを作成したいと思います。
これが私が実際に欲しいものの説明です:私はHTML要素の詳細を取得する拡張機能を作成しました。
しかし、Chromeを起動するたびに起動します。これを行う代わりに、Chrome拡張機能にメッセージを送信してHTML要素の詳細を取得し、それをC#アプリケーションに送り返す方法はありますか?

'XMLHttpRequest'を使用してC#に情報を渡すことはできますが、問題は、ページが読み込まれたときに開始されることです。

私が欲しいものをあなたに説明させてください:

  1. Chromeを開くと、拡張機能が自動的に起動し、background.cs(背景ページ)も起動します。(ここでは、クライアントサーバーのような通信が必要です)

  2. C#アプリケーションを使用して、Chrome拡張機能(StartFetchingDocumentなど)にデータを送信します

  3. エクステンションがこのメッセージ(つまりStartFetchingDocument)を受け取ると、拡張機能は選択したタブにcontect-sctipt.jsを挿入する必要があります。

そのデータをC#に送り返すために必要な残りのことはわかっていますが、ここでは、この1つの段階(C#から拡張機能(バックグラウンドページ)にデータを送信する方法)でのみ行き詰まりました。

4

3 に答える 3

11

うーん...おそらくもっと良い方法がありますが、簡単な方法は、c#アプリでHttpListenerを開いて、次のような拡張機能から通信することです。

var listener = "http://localhost:60024/";

function getCommand(){

    var postData = { 
        "action": "getCommand" 
    };

    $.post( listener, postData, function(response){
        //Parse response and do whatever c# wants
    });
}

function send(data){

    var postData = {
        "action" : "send",
        "data": data
    };

    $.post(listener, postData);
}


setInterval(getCommand, 1000);

この例では、拡張コンテキストに追加できるjQuery.postを使用していますが、必要に応じてXMLHttpRequestを使用することもできます。そしてc#側では:

using System;
using System.Net;


namespace HttpListenerTEst
{
    class Program
    {
        private static HttpListener _listener;

        static void Main(string[] args)
        {
            _listener = new HttpListener();
            _listener.Prefixes.Add("http://localhost:60024/");
            _listener.Start();
            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);

            Console.ReadLine();
        }

        static void ProcessRequest(IAsyncResult result)
        {
            HttpListenerContext context = _listener.EndGetContext(result);
            HttpListenerRequest request = context.Request;

            //Answer getCommand/get post data/do whatever

            _listener.BeginGetContext(new AsyncCallback(Program.ProcessRequest), null);
        }
    }
}

ProcessRequest関数では、投稿データを読み取ったり、何かを送り返したりすることができます。

投稿データを取得する:

        string postData;
        using (var reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            postData = reader.ReadToEnd();
            //use your favourite json parser here
        }

そして、いくつかのものを送り返します:

        string responseString           = "This could be json to be parsed by the extension";

        HttpListenerResponse response   = context.Response;
        response.ContentType            = "text/html";

        byte[] buffer                   = System.Text.Encoding.UTF8.GetBytes(responseString);
        response.ContentLength64        = buffer.Length;
        Stream output                   = response.OutputStream;

        output.Write(buffer, 0, buffer.Length);
        output.Close();

より良いアイデアを楽しみにして、ちょっとしたブレインストーミングをしてください:)

于 2012-12-19T13:29:42.463 に答える
0

RemoteDebuggingのデバッグモードでChromeを起動し、指定されたポートを介してChromeに接続できる場合は、これを実行できる可能性がありますが、少し面倒です。

Adobe Bracketsがどのようにそれを行うかを調査することを試みることができますが、私はそれが同じ方法であると感じています。

于 2012-12-17T08:52:28.357 に答える
0

Google Chrome拡張機能のほとんどは、HTML、CSS、またはJavascriptで記述されています。次に、拡張機能ディレクトリをChrome拡張機能ファイルにバンドルするの.crxは、短いを実行するのと同じくらい簡単Python scriptです。ただし、C#はJavascriptに変換でき、拡張機能用に独自のビジネスロジックを記述できます。見るScript#

于 2012-12-17T09:01:31.793 に答える