亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2621 | 回復(fù): 1
打印 上一主題 下一主題

把PHP作為C#程序的腳本語言 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-03-19 21:07 |只看該作者 |倒序?yàn)g覽
把PHP作為C#程序的腳本語言







 當(dāng)我們打算創(chuàng)建一個(gè).net程序時(shí)(包括桌面程序或者Web應(yīng)用程序),如果能使用其他語言來擴(kuò)展這個(gè).net程序的功能的話那肯定會(huì)相當(dāng)有實(shí)用價(jià)值。  比如某些用戶可以寫一個(gè)簡單腳本來設(shè)置這個(gè)程序的一些設(shè)定,或者...       當(dāng)我們打算創(chuàng)建一個(gè).net程序時(shí)(包括桌面程序或者Web應(yīng)用程序),如果能使用其他語言來擴(kuò)展這個(gè).net程序的功能的話那肯定會(huì)相當(dāng)有實(shí)用價(jià)值。

  比如某些用戶可以寫一個(gè)簡單腳本來設(shè)置這個(gè)程序的一些設(shè)定,或者在程序中修改數(shù)據(jù)是如何持久化保存的,或者為這個(gè).net程序?qū)懸粋(gè)簡單的插件。在這篇文章,我們來看看如何讓php作為.net程序的腳本語言

  顯然這樣做有很多的好處:

  1,很多程序員都會(huì)寫一些基本的PHP代碼,甚至一個(gè)初級程序員都能為你的應(yīng)用寫一個(gè)簡單的PHP腳本代碼

  2, PHP是非常容易使用的,網(wǎng)絡(luò)上已經(jīng)有了一大堆現(xiàn)成的php代碼片段可以拿來復(fù)制后直接使用

  3,歸功于Phalanger庫( http://phalanger.codeplex.com/), PHP代碼能夠很容易地獲取任何.net庫以及調(diào)用幾乎所有.net程序提供的服務(wù)

  上面描述的場景僅僅只是使用Phalanger from C#(或者其他編程語言)在運(yùn)行時(shí)生成PHP代碼的一小部分案例,打個(gè)比方,你能想象一下一個(gè)web網(wǎng)絡(luò)架構(gòu)使用C#來寫域名模塊然后使用PHP去搭建用戶接口會(huì)是什么樣子. 所以本文將展示如何在C#的程序中運(yùn)行PHP代碼,與怎么使用全局變量作為參數(shù)傳遞到PHP代碼,以及如何讀取標(biāo)準(zhǔn).net流。

  Phalanger 是一個(gè)將PHP腳本編譯成.net字節(jié)碼的編譯器,它本身就被設(shè)計(jì)用來允許無縫地讓.net與其他語言進(jìn)行雙向的互操作性。

  這就意味著你能在php代碼中調(diào)用.net方法以及使用.net的類(http://wiki.phpcompiler.net/.NET_interoperability),同時(shí)你也能在C#或者F#中調(diào)用php的方法以及使用php的類.( http://wiki.phpcompiler.net/Code ... de_interoperability)

  同時(shí)本文展示了另外一種使用Phalanger的方式:通過.net程序來運(yùn)行php代碼.尤其當(dāng)被運(yùn)行的代碼是動(dòng)態(tài)獲取的或者無法被預(yù)編譯為程序集時(shí)(例如當(dāng)代碼是后來被用戶所寫的這種情況).當(dāng)運(yùn)行的的php代碼沒有任何改變時(shí),一般你應(yīng)該使用預(yù)編譯的腳本庫( http://wiki.phpcompiler.net/Code ... de_interoperability),這樣能夠得到更高的效率因?yàn)樵谶\(yùn)行時(shí)它們不會(huì)參與編譯。

  配置

  在ASP.NET 4.0 C#的網(wǎng)站程序中我已經(jīng)測試過這個(gè)技術(shù)了,當(dāng)然,在.net控制臺(tái)程序或者winforms這樣的桌面應(yīng)用程序中也是可行的。但要記住你的.net程序必須是使用.net 4.0(full profile)作為目標(biāo).net框架,以及必須引用至少一個(gè)Phalanger的程序集:“PhpNetCore, Version=2.1.0.0, Culture=neutral, PublicKeyToken=0A8E8C4C76728C71". Phalanger必須在你的應(yīng)用程序中正確配置。雖然它一樣可以被手動(dòng)配置(http://www.php-compiler.net/blog ... -free-phalanger-web),但最簡單的方式就是使用安裝器了。

  源碼

  不可思議的是運(yùn)行PHP代碼的核心就是PHP.Core.DynamicCode.Eval這個(gè)方法, 它在PhpNetCore.dll程序集中,唯一有些麻煩的可能就是方法所需的大量參數(shù)了。首先我們需要一個(gè)可用的PHP.Core.ScriptContext實(shí)例, 這就是Phalanger的運(yùn)行php代碼的執(zhí)行實(shí)例。你能從當(dāng)前線程上獲取一個(gè)這樣的實(shí)例.特別注意PHP不是多線程的,所以ScriptContext只是僅僅與一個(gè)線程緊密關(guān)聯(lián)

  1.   1var context = PHP.Core.ScriptContext.CurrentContext;
復(fù)制代碼
然后我們將設(shè)置ScriptContext的輸出方式,這樣PHP腳本才能轉(zhuǎn)換出我們所需要的流。這里我們將設(shè)置兩個(gè)輸出方式 - 字節(jié)流以及文本流。注意在最后你必須銷毀這些流,以至于所有的數(shù)據(jù)將會(huì)被正確的刷新
  1.   1context.OutputStream = output;

  2.   2using (context.Output = new System.IO.StreamWriter(output)) {
復(fù)制代碼
我們也能在ScriptContext中設(shè)置全局變量,這樣我們也能很方便的傳輸一些參數(shù)到運(yùn)行的PHP代碼中。

  1.   1Operators.SetVariable(context, null, "X", "Hello World!");
復(fù)制代碼
最終我們將使用的Eval方法來運(yùn)行PHP代碼. 而這個(gè)方法實(shí)際上被Phalanger內(nèi)部用來處理PHP的 eval() 表達(dá)式.所以這就是為什么這個(gè)方法有如此多參數(shù)的原因。
  1.  01// evaluate our code:

  2.   02return DynamicCode.Eval(

  3.   03 code,

  4.   04 false,/*phalanger internal stuff*/

  5.   05 context,

  6.   06 null,/*local variables*/

  7.   07 null,/*reference to "$this"*/

  8.   08 null,/*current class context*/

  9.   09 "Default.aspx.cs",/*file name, used for debug and cache key*/

  10.   10 1,1,/*position in the file used for debug and cache key*/

  11.   11 -1,/*something internal*/

  12.   12 null/*current namespace, used in CLR mode*/

  13.   13);
復(fù)制代碼
如果運(yùn)行代碼表現(xiàn)得和全局php代碼一樣時(shí),大部分參數(shù)看上去就沒什么特別之處了。最重要的參數(shù)就是code.該參數(shù)是一個(gè)包含你的php代碼的字符串。Phalanger將先轉(zhuǎn)譯然后再編譯這段代碼。轉(zhuǎn)換出的.net字節(jié)碼被將被作為臨時(shí)程序集被存儲(chǔ)在內(nèi)存中(我們也稱它為瞬時(shí)程序集)

  。注意整個(gè)轉(zhuǎn)譯以及編譯的過程很快,因?yàn)樗矔r(shí)程序集也會(huì)被緩存起來加速的運(yùn)行相同PHP代碼。

  如你所見,你也能在參數(shù)file name以及 postion中提供文件名以及文件所在位置;所以當(dāng)你調(diào)試代碼然后單步調(diào)試進(jìn)入表達(dá)式時(shí),它將會(huì)剛好跳到position參數(shù)指定的位置。

  注意被緩存的瞬時(shí)程序集是否被更新將依賴于ScriptContext前面執(zhí)行的PHP代碼(比如定義好的類以及方法),只有前后兩次生成的PHP代碼一致時(shí),瞬時(shí)程序集才能被緩存下來。這就是為什么Eval方法中的參數(shù)code,file name以及position與前面的的匹配時(shí)才能緩存后被重用。

  那么我們要記住,當(dāng)隨后要運(yùn)行更多的PHP代碼片段時(shí)你應(yīng)該首先考慮這個(gè)問題。

  最后如果你打算在web應(yīng)用程序中使用Phalanger時(shí),你應(yīng)該首先就初始化PHP.Core.RequestContext, 然后在php腳本結(jié)束時(shí)銷毀它。
  1.   1using (var request_context = RequestContext.Initialize(

  2.   2 ApplicationContext.Default,

  3.   3 HttpContext.Current))

  4.   4{ /* all the stuff above */ }
復(fù)制代碼
總結(jié):

  總共就是這些。 因?yàn)楹竺鎴?zhí)行的的PHP代碼中也包含了已經(jīng)定義好的PHP方法,變量以及類,所以你也能在.net代碼中使用它們。

  .net應(yīng)用程序功能的語言。你也能用這個(gè)技術(shù)去創(chuàng)建一個(gè)使用c#建立域名模塊和PHP搭建用戶接口的web應(yīng)用程序。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-03-19 21:07 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP