原文: http://dotnet.dzone.com/articles/php-scripting- language-c
.net プログラム (デスクトップ プログラムや Web アプリケーションを含む) を作成する予定がある場合、他の言語を使用して .net プログラムの機能を拡張できれば、非常に実用的になります。
たとえば、一部のユーザーは、このプログラムの一部の設定を行う簡単なスクリプトを作成したり、プログラム内でのデータの保持方法を変更したり、この .net プログラム用の簡単なプラグインを作成したりできます。この記事では、.net プログラムのスクリプト言語として php を使用する方法を見てみましょう
これを行うことには明らかに多くの利点があります:
1. 多くのプログラマーは、いくつかの基本的な PHP コードを書くことができます。ジュニア プログラマーでも、アプリケーション用の簡単な PHP スクリプト コードを書くことができます。
2. PHP は非常に使いやすいです。インターネット上には、コピーして直接使用できる既成の PHP コード スニペットがすでにたくさんあります。
3. Phalanger ライブラリ (http://pharanger.codeplex.com/) のおかげで、PHP コードは任意の .net ライブラリを簡単に取得し、.net プログラムによって提供されるほぼすべてのサービスを呼び出すことができます
上で説明したシナリオは、C# (または他のプログラミング言語) の Phalanger を使用して実行時に PHP コードを生成するケースのほんの一部です。たとえば、C# を使用してドメイン名モジュールを作成し、そこで、この記事では、C# プログラムで PHP コードを実行する方法、PHP コードに渡すパラメーターとしてグローバル変数を使用する方法、および標準の を読み取る方法を説明します。ネットストリーム。
Phalanger は、PHP スクリプトを .net バイトコードにコンパイルするコンパイラで、.net と他の言語間のシームレスな双方向相互運用性を可能にするように設計されています。
これは、PHP コードで .net メソッドを呼び出して .net クラスを使用できることを意味します (http://wiki.phpcompiler.net/.NET_interoperability)。また、PHP メソッドを呼び出して C# または F# PHP クラスで使用することもできます。(http://wiki.phpcompiler.net/.NET_interoperability) ://wiki.phpcompiler.net/Code_Samples/Standard_mode_interoperability)
同時に、この記事では、Phalanger の別の使用方法、特に実行するコードが動的に取得される場合、またはアセンブリにプリコンパイルできない場合 (コードが後で作成される場合など) を示します。この場合、実行中の PHP コードに変更がない場合は、通常、プリコンパイルされたスクリプト ライブラリ (http://wiki.phpcompiler.net/Code_Samples/Standard_mode_interoperability) を使用する必要があります。実行時のコンパイルには参加しません。
構成
私はこのテクノロジーを ASP.NET 4.0 C# Web サイト プログラムでテストしました。もちろん、.net コンソール プログラムや winforms などのデスクトップ アプリケーションでも実現可能です。ただし、.net プログラムはターゲット .net フレームワークとして .net 4.0 (完全なプロファイル) を使用し、少なくとも 1 つの Phalanger アセンブリ「PhpNetCore、Version=2.1.0.0、Culture=neutral、PublicKeyToken= 0A8E8C4C76728C71」を参照する必要があることに注意してください。 Phalanger はアプリケーションで正しく設定する必要があります。手動で設定することもできますが (http://www.php-compiler.net/blog/2011/installation-free-pharanger-web)、最も簡単な方法はインストーラーを使用することです。
ソースコード
驚くべきことに、PHP コードの実行の中核は、PhpNetCore.dll アセンブリに含まれるメソッド PHP.Core.DynamicCode.Eval です。唯一の問題は、このメソッドに必要なパラメータが多数であることです。まず、利用可能な PHP.Core.ScriptContext インスタンスが必要です。これは、PHP コードを実行するための Phalanger の実行インスタンスです。このようなインスタンスは現在のスレッドから取得できます。PHP はマルチスレッドではないため、ScriptContext は 1 つのスレッドにのみ密接に関連付けられることに注意してください。
1
var context = PHP.Core.ScriptContext.CurrentContext;
次に、PHP スクリプトが必要なストリームを変換できるように、ScriptContext の出力モードを設定します。ここでは、バイト ストリームとテキスト ストリームという 2 つの出力方法を設定します。すべてのデータが正しくフラッシュされるように、最後にこれらのストリームを破棄する必要があることに注意してください
1
context.OutputStream = 出力;
2
using (context.Output = new System.IO.StreamWriter(output)) {
ScriptContext でグローバル変数を設定することもできるため、実行中の PHP コードにいくつかのパラメーターを簡単に転送できます。
1
Operators.SetVariable(context, null, "X", "Hello World!");
最終的には、Eval メソッドを使用して PHP コードを実行します。このメソッドは実際に PHP の eval() 式を処理するために内部で使用されます。そのため、このメソッドには非常に多くのパラメーターがあります。
01
// コードを評価します:
02
return DynamicCode.Eval(
03
コード、
04
間違っています、/*ファランガー内部のもの*/
05
コンテキスト、
06
Null、/*ローカル変数*/
07
null,/*「$this」への参照*/
08
Null、/*現在のクラスコンテキスト*/
09
"Default.aspx.cs",/*デバッグおよびキャッシュ キーに使用されるファイル名*/
10
1,1,/*デバッグおよびキャッシュキーに使用されるファイル内の位置*/
11
-1,/*内部的なもの*/
12
null/*現在の名前空間、CLR モードで使用*/
13
);
実行中のコードがグローバル PHP コードと同じように動作する場合、パラメータのほとんどは特別なものではありません。最も重要なパラメータは code です。このパラメータは PHP コードを含む文字列です。 Phalanger は、まずこのコードを翻訳してからコンパイルします。変換された .net バイトコードは、一時アセンブリ (一時アセンブリとも呼ばれます) としてメモリに保存されます
。同じ PHP コードの実行を高速化するために一時的なアセンブリもキャッシュされるため、変換とコンパイルのプロセス全体が非常に高速であることに注意してください。
ご覧のとおり、ファイル名と位置パラメーターでファイル名とファイルの場所を指定することもできるため、コードをデバッグして式にステップインすると、位置パラメーターで指定された位置に正確にジャンプします。
キャッシュされた一時アセンブリが更新されるかどうかは、ScriptContext によって以前に実行された PHP コード (定義されたクラスやメソッドなど) に依存することに注意してください。2 回生成された PHP コードが一貫している場合にのみ、一時アセンブリをキャッシュできます。このため、Eval メソッドのパラメーター コード、ファイル名、および位置は、以前のものと一致する場合にのみキャッシュして再利用できます。
次に、後でさらに PHP コード スニペットを実行するときに、最初にこの問題を考慮する必要があることを覚えておく必要があります。
最後に、Web アプリケーションで Phalanger を使用する予定がある場合は、最初に PHP.Core.RequestContext を初期化し、PHP スクリプトの最後でこれを破棄する必要があります。
1
using (var request_context = RequestContext.Initialize(
)
2
ApplicationContext.Default,
3
HttpContext.Current))
4
{ /* 上記のすべて */ }
概要:
それだけです。 後で実行される PHP コードには定義済みの PHP メソッド、変数、クラスも含まれるため、それらを .net コードでも使用できます。
.net アプリケーション機能の言語。この手法を使用して、C# を使用してドメイン名モジュールを作成し、PHP を使用してユーザー インターフェイスを構築する Web アプリケーションを作成することもできます。
これに興味があり、さらに詳しい情報が必要な場合は、Standard_mode_interoperability に関する最新の記事 (http://wiki.phpcompiler.net/Code_Samples/Standard_mode_interoperability) を参照してください。
著者ジュンウォンさんのブログ