.NET 腳本(二)
2024-07-10 12:57:48
供稿:網(wǎng)友
 
這個版本太大了,以至于我想把它提到一個主版本號的升級。下面是修復(fù)和提高的列表。 
一個app.config 文件被添加進(jìn)來, 用來替代在.dnml 文件中重復(fù)的選項(xiàng)xml 元素,如: waitforuseraction, 入口方法,腳本語言和常見的引用程序集。我還為腳本引擎添加了添加新語言的功能,因此你可以用任何語言編寫.net 腳本文件,只要定義了該語言的'codeprovider' 類(在后面會更詳細(xì)地提到)。在app.config 文件中定義的值就如機(jī)器配置一樣。也就是是或,這些基本值可以被dnml 文件中的值所覆蓋。dnml 文件中的值具有最高優(yōu)先級,它將被腳本引擎使用。但是如果你的.dnml 腳本文件沒有定義任何配置,app.config 文件中的值將被使用。這樣可以讓你在.dnml 文件中只定義實(shí)際的代碼。 
用戶偏好配置段: 一個用戶偏好段被添加到app.config 文件中。這個段定義了三個配置。默認(rèn)語言,腳本入口和等待用戶動作標(biāo)志。默認(rèn)語言用來確定當(dāng)dnml 文件中沒有定義語言元素時腳本語言的語言。入口是指當(dāng)dnml 文件沒有定義入口時腳本引擎將會調(diào)用的方法。waitforuseraction 標(biāo)簽是一個布爾值,用來決定當(dāng)腳本執(zhí)行完畢后控制臺窗口是否保留,并等待一個crlf 按鍵。如果這沒有在dnml 文件中定義,config 文件中的值將被腳本引擎調(diào)用。下面是這個段的一個例子。
<userpreferences defaultlanguage="c#" entrypoint="main" 
 waitforuseraction="true" />
程序集引用配置段: 這個段被用來定義腳本執(zhí)行需要的程序集。任何在該段定義的程序集都會在每個腳本運(yùn)行時編譯進(jìn)來。只需要程序集名稱,而不是完全路徑名。下面是這個段的一個例子。
 <referencedassemblies>
 <assembly path="system.dll" />
 <assembly path="system.messaging.dll" />
 <assembly path="system.messaging.dll" />
 <assembly path="system.security.dll" />
</referencedassemblies>
語言支持配置段: 這個段讓你動態(tài)為腳本引擎添加新的支持語言,而不需重新便宜引擎代碼。屬性name 就是在dnml 文件中定義的名稱,或是在用戶偏好段中的defaultlanguage 屬性。屬性 assembly 就是包含codeprovder 該語言實(shí)現(xiàn)的程序集完整路徑名和文件名。屬性codeprovidername 就是該語言的code provider 類,包含所在名字空間。查看一下類assemblygenerator 的latebindcodeprovider() 方法可以了解一下我是怎樣為腳本引擎添加該項(xiàng)功能的。
 
<supportedlanguages>
 
 <language name="jscript" 
assembly="c:/winnt/microsoft.net/framework/v1.1.4322/microsoft.jscript.dll"
 
 codeprovidername="microsoft.jscript.jscriptcodeprovider" />
 
 <language name="j#" 
assembly="c:/winnt/microsoft.net/framework/v1.1.4322/vjsharpcodeprovider.dll"
 
 codeprovidername="microsoft.vjsharp.vjsharpcodeprovider" />
 
</supportedlanguages> 
 
更新 2/18/04: 版本 1.0.2.0
我修補(bǔ)了charlie pointed out 提到的用dotnetscriptengine.exe 注冊.dnml 文件擴(kuò)展名關(guān)聯(lián)的一個錯誤。 
還為dnml 文件格式添加了一個可選的entrypoint 屬性。這樣可以讓用戶指定一個程序集入口而不僅僅是"main" 方法。如果屬性entrypoint 被一個方法名稱填充,則該方法將成為入口點(diǎn)。否則,"main" 將成為默認(rèn)的程序集入口點(diǎn)。
元素language 可以用以下三種方式定義。
<language name="c#" /> main() will be the 
 entry method to the assembly
<language name="c#" entrypoint"" /> main() will 
 be the entry method to the assembly
<language name="c#" entrypoint"stuff" /> stuff() 
 will be the entry method to the assembly 
我還為.dnml xml 格式添加了一個可選的<waitforuseraction> 元素。這是一個新假如的特征,它可以讓你當(dāng)腳本執(zhí)行完畢后仍保留控制臺窗口。元素 waitforuseraction 是可選的。如果它沒有包含在.dnml 文件中,那么窗口將會保留(打開)。該屬性值可以是'true' 或 'false'。如果為真,窗口會保留。如果為假,當(dāng)腳本執(zhí)行完畢后控制臺窗口會馬上關(guān)閉。 這樣可以讓你把若干個腳本文件鏈接到一個批處理文件中來。
使用該元素的可能途徑。 
--nothing-- console window will remain open after script has run
<waitforuseraction value="true"/> console window will 
 remain open after script has run
<waitforuseraction value="true"/> console window will 
 remain open after script has run
<waitforuseraction value="true"/> console window will 
 remain open after script has run
<waitforuseraction value="false"/> console window will 
 close after script has run
<waitforuseraction value="false"/> console window will 
 close after script has run
<waitforuseraction value="false"/> console window will 
 close after script has run
最后,我添加了.net 腳本返回給調(diào)用進(jìn)程, cmd或批處理文件,一個值的功能,該值可以是空的,也可以是一個整數(shù)。現(xiàn)在有兩種定義腳本入口方法返回值的方式。你可以定義它為空,也可以定義它為一個整型值。如果你使用空值,腳本將不會返回任何東西。如果你使用整型值,腳本引擎將會返回給調(diào)用它的進(jìn)程一個整型值。 
兩個不同的腳本入口方法的例子:
//the script engine will return nothing when this script is called.
public static void main()
{
 //...do stuff
 return;
} 
//the script engine will return a 5 when this script is called.
public static int main()
{
 //...do stuff
 return 5;
} 
//the script engine will return nothing when this script is called.
public shared sub main()
 '...do stuff
 return
end sub
 
//the script engine will return a 5 when this script is called.
public shared function main() as integer
 '...do stuff
 return 5
end function
菜鳥學(xué)堂: