|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
模仿的不光是模仿,模仿的同时在加改进,就成了自己的作品了。 当咱们盘算创立一个.net法式时(包含桌面法式或Web使用法式),假如能利用其他言语来扩大这个.net法式的功效的话那一定会相当有适用价值。
好比某些用户可以写一个复杂剧本来设置这个法式的一些设定,或在法式中修正数据是若何耐久化保留的,或为这个.net法式写一个复杂的插件。在这篇文章,咱们来看看若何让php作为.net法式的剧本言语
明显如许做有良多的优点:
1,良多法式员城市写一些根基的PHP代码,乃至一个低级法式员都能为你的使用写一个复杂的PHP剧本代码
2, PHP长短常轻易利用的,收集上已有了一大堆现成的php代码片断可以拿来复制后直接利用
3,归功于Phalanger库( http://phalanger.codeplex.com/), PHP代码可以很轻易地获得任何.net库和挪用几近一切.net法式供应的办事
下面描写的场景仅仅只是利用Phalanger from C#(或其他编程言语)在运转时生成PHP代码的一小局部案例,打个例如,你能想象一下一个web收集架构利用C#来写域名模块然后利用PHP去搭建用户接口会是甚么模样. 所以本文将展现若何在C#的法式中运转PHP代码,与怎样利用全局变量作为参数传递到PHP代码,和若何读取尺度.net流。
Phalanger 是一个将PHP剧本编译成.net字节码的编译器,它自己就被设计用来答应无缝地让.net与其他言语停止双向的互操作性。
这就意味着你能在php代码中挪用.net办法和利用.net的类(http://wiki.phpcompiler.net/.NET_interoperability),同时你也能在C#或F#中挪用php的办法和利用php的类.( http://wiki.phpcompiler.net/Code_Samples/Standard_mode_interoperability)
同时本文展现了别的一种利用Phalanger的体例:经由过程.net法式来运转php代码.特别当被运转的代码是静态获得的或没法被预编译为法式集时(例如今世码是后来被用户所写的这类情形).当运转的的php代码没有任何改动时,普通你应当利用预编译的剧本库( http://wiki.phpcompiler.net/Code_Samples/Standard_mode_interoperability),如许可以失掉更高的效力由于在运转时它们不会介入编译。
设置装备摆设
在ASP.NET 4.0 C#的网站法式中我已测试过这个手艺了,固然,在.net掌握台法式或winforms如许的桌面使用法式中也是可行的。但要记住你的.net法式必需是利用.net 4.0(full profile)作为方针.net框架,和必需援用最少一个Phalanger的法式集:“PhpNetCore, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0A8E8C4C76728C71". Phalanger必需在你的使用法式中准确设置装备摆设。固然它一样可以被手动设置装备摆设(http://www.php-compiler.net/blog/2011/installation-free-phalanger-web),但最复杂的体例就是利用装置器了。
源码
难以想象的是运转PHP代码的中心就是PHP.Core.DynamicCode.Eval这个办法, 它在PhpNetCore.dll法式集中,独一有些费事的能够就是办法所需的大批参数了。起首咱们需求一个可用的PHP.Core.ScriptContext实例, 这就是Phalanger的运转php代码的履行实例。你能从以后线程上获得一个如许的实例.出格注重PHP不是多线程的,所以ScriptContext只是仅仅与一个线程严密联系关系
1var context = PHP.Core.ScriptContext.CurrentContext;
然后咱们将设置ScriptContext的输入体例,如许PHP剧本才干转换出咱们所需求的流。这里咱们将设置两个输入体例 - 字撙节和文本流。注重在最初你必需烧毁这些流,以致于一切的数据将会被准确的刷新
1context.OutputStream = output;
2using (context.Output = new System.IO.StreamWriter(output)) {
咱们也能在ScriptContext中设置全局变量,如许咱们也能很便利的传输一些参数到运转的PHP代码中。
1Operators.SetVariable(context, null, "X", "Hello World!");
终究咱们将利用的Eval办法来运转PHP代码. 而这个办法实践上被Phalanger外部用来处置PHP的 eval() 表达式.所以这就是为何这个办法有如斯多参数的缘由。
01// evaluate our code:
02return DynamicCode.Eval(
03 code,
04 false,/*phalanger internal stuff*/
05 context,
06 null,/*local variables*/
07 null,/*reference to "$this"*/
08 null,/*current class context*/
09 "Default.aspx.cs",/*file name, used for debug and cache key*/
10 1,1,/*position in the file used for debug and cache key*/
11 -1,/*something internal*/
12 null/*current namespace, used in CLR mode*/
13);
假如运转代码体现得和全局php代码一样时,大局部参数看上去就没甚么出格的地方了。最主要的参数就是code.该参数是一个包括你的php代码的字符串。Phalanger将先转译然后再编译这段代码。转换出的.net字节码被将被作为一时法式集被存储在内存中(咱们也称它为瞬时法式集)
。注重全部转译和编译的进程很快,由于瞬时法式集也会被缓存起来减速的运转不异PHP代码。
如你所见,你也能在参数file name和 postion中供应文件名和文件地点地位;所以当你调试代码然后单步伐试进入表达式时,它将会恰好跳到position参数指定的地位。
注重被缓存的瞬时法式集是不是被更新将依附于ScriptContext后面履行的PHP代码(好比界说好的类和办法),只要前后两次生成的PHP代码分歧时,瞬时法式集才干被缓存上去。这就是为何Eval办法中的参数code,file name和position与后面的的婚配时才干缓存后被重用。
那末咱们要记住,当随后要运转更多的PHP代码片断时你应当起首思索这个成绩。
最初假如你盘算在web使用法式中利用Phalanger时,你应当起首就初始化PHP.Core.RequestContext, 然后在php剧本停止时烧毁它。
1using (var request_context = RequestContext.Initialize(
2 ApplicationContext.Default,
3 HttpContext.Current))
4{ /* all the stuff above */ }
总结:
总共就是这些。 由于前面履行的的PHP代码中也包括了已界说好的PHP办法,变量和类,所以你也能在.net代码中利用它们。
.net使用法式功效的言语。你也能用这个手艺去创立一个利用c#创立域名模块和PHP搭建用户接口的web使用法式。
PHP于1994年由Rasmus Lerdorf创建,刚刚开始是Rasmus Lerdorf为了要维护个人网页而制作的一个简单的用Perl语言编写的程序。 |
|