2

名前空間として設定した既存の API に、Jint で実行するスクリプトがアクセスできるようにしたいと考えています。つまり、他の名前空間を含め、API を含む名前空間が 1 つあるということです。スクリプトが残りのコード (.Net フレームワークを含む) にアクセスできるようにしたくありません。

私はすでにこれをJintフォーラムに投稿しました: http://jint.codeplex.com/discussions/310772 ただし、彼らに無礼ではありませんが、フォーラムはあまり活発ではないようで、これに答えたいと思います。できるだけ早く、私もここに投稿しています。

少し前に、ThomasMaierhofer がこれに似たものを達成しました

経験の浅い私の脳には、これは API をエンジンに公開するための非常に巧妙な方法のように思えますが、このように行われたことはこれまで見たことがありません。

だから私の質問は次のとおりです。これは機能しますか?もしそうなら、なぜ以前はこのように行われなかったのですか? 新しいバージョンが利用可能になったときに、Jint .dll を簡単に更新できるように、Jint ソースを変更せずにこれを達成する方法はありますか?

EDIT: 私が持っている現在のAPIは、それぞれが複数の機能を持つ複数のクラスで構成されています。SetParameter を使用して、これらのクラスの特定のインスタンスを完全に公開できます。Jint には、名前空間を完全に修飾することによってスクリプトが CLR にアクセスできるようにする AllowClr プロパティもあります。これは、これを false に設定するとどうなるかを示すサンプル コードです。ソース: http://jint.codeplex.com/wikipage?title=Using%20.NET%20classes%20from%20scripts

string stringBuilder = @"
    var sb = new System.Text.StringBuilder();
    return sb.ToString();
    ";
var engine = new JintEngine();
engine.AllowClr = false;
engine.Run(stringBuilder); // throws a SecurityException

これを許可したいのですが、他のすべてではなく、特定の名前空間に対してのみ許可します。質問がより明確になることを願っています。

ご協力いただきありがとうございます、

サム。

PS私はVB.Netで作業していますが、C#を含む回答は問題ありません。

4

1 に答える 1

1

Jint には基本的に 2 つの方法がSetParameterあります。これは、決定した名前でアクセスすることにより、インタープリターから呼び出すことができるオブジェクト インスタンスを渡すことができます。またSetFunction()、エンジンがホスティング コード内の関数を直接呼び出せるようにします。 . 何らかの規則に従ってプログラムで多くのオブジェクトを公開したい場合は、リフレクションを使用できます。これにより、ジント コードを変更せずに要件を満たすことができると思います。

于 2012-02-16T13:24:40.180 に答える