『壹』 詳解.NET中的動態編譯技術
代碼的動態編譯並執行是一個 NET平台提供給我們的很強大的工具用以靈活擴展(當然是面對內部開發人員)復雜而無法估算的邏輯 並通過一些額外的代碼來擴展我們已有 的應用程序 這在很大程度上給我們提供了另外一種擴展的方式(當然這並不能算是嚴格意義上的擴展 但至少為我們提供了一種思路) 動態代碼執行可以應用在諸如模板生成 外加邏輯擴展等一些場合 一個簡單的例子 為了網站那的響應速度 HTML靜態頁面往往是我們最好的選擇 但基於數據驅動的網站往往又很難用靜態頁面實現 那麼將動態頁面生成的工作或許就是一個很好的應用場合 另外 對於一些模板的套用 我們同樣可以用它來做 另外這本身也是插件編寫的方式
最基本的動態編譯
Net為我們提供了很強大的支持來實現這一切我們可以去做的基礎 主要應用的兩個命名空間是 System CodeDom Compiler和Microsoft CSharp或Microsoft VisualBasic 另外還需要用到反射來動態執行你的代碼 動態編譯並執行代碼的原理其實在於將提供的源代碼交予CSharpCodeProvider來執行編譯(其實和CSC沒什麼兩樣) 如果沒有任何編譯錯誤 生成的IL代碼會被編譯成DLL存放於於內存並載入在某個應用程序域(默認為當前)內並通過反射的方式來調用其某個方法或者觸發某個事件等 之所以說它是插件編寫的一種方式也正是因為與此 我們可以通過預先定義好的借口來組織和擴展我們的程序並將其交還給主程序去觸發 一個基本的動態編譯並執行代碼的步驟包括
· 將要被編譯和執行的代碼讀入並以字元串方式保存
· 聲明CSharpCodeProvider對象實例
· 調用CSharpCodeProvider實例的CompileAssemblyFromSource方法編譯
· 用反射生成被生成對象的實例(Assembly CreateInstance)
· 調用其方法
以下代碼片段包含了完整的編譯和執行過程
//get the code to pile string strSourceCode = this txtSource Text; // Create a new CSharpCodePrivoder instance CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // Sets the runtime piling parameters
by crating a new CompilerParameters instance CompilerParameters objCompilerParameters = new CompilerParameters(); objCompilerParameters ReferencedAssemblies Add( System dll ); objCompilerParameters ReferencedAssemblies Add( System Windows Forms dll ); objCompilerParameters GenerateInMemory = true; // CompilerResults: Complile the code snippet
by calling a method from the provider CompilerResults cr = objCSharpCodePrivoder
CompileAssemblyFromSource(objCompilerParameters
strSourceCode); if (cr Errors HasErrors) { string strErrorMsg = cr Errors Count ToString() + Errors: ; for (int x = ; x < cr Errors Count; x++) { strErrorMsg = strErrorMsg + Line: + cr Errors[x] Line ToString() + + cr Errors[x] ErrorText; } this txtResult Text = strErrorMsg; MessageBox Show( There were build erros please modify your code
Compiling Error ); return; } // Invoke the method by using Reflection Assembly objAssembly = cr CompiledAssembly; object objClass = objAssembly CreateInstance( Dynamicly HelloWorld ); if (objClass == null) { this txtResult Text = Error: + Couldn t load class ; return; } object[] objCodeParms = new object[ ]; objCodeParms[ ] = Allan ; string strResult = (string)objClass GetType() InvokeMember( GetTime BindingFlags InvokeMethod null objClass objCodeParms); this txtResult Text = strResult;
需要解釋的是 這里我們在傳遞編譯參數時設置了GenerateInMemory為true 這表明生成的DLL會被載入在內存中(隨後被默認引用入當前應用程序域) 在調用GetTime方法時我們需要加入參數 傳遞object類型的數組並通過Reflection的InvokeMember來調用 在創建生成的Assembly中的對象實例時 需要注意用到的命名空間是你輸入代碼的真實命名空間 以下是我們輸入的測試代碼(為了方便 所有的代碼都在外部輸入 動態執行時不做調整)
using System; namespace Dynamicly { public class HelloWorld { public string GetTime(string strName) { return Wele + strName +
Check in at + System DateTime Now ToString(); } } }
運行附件中提供的程序 可以很容易得到一下結果
『貳』 怎麼用net編譯cs文件
操作如下:
打開命令窗口->輸磨森入cmd到控制台->cd C:WINDOWSMicrosoft.NETFrameworkv1.1.4322轉到vs.net安裝的該目錄下->執行csc命令csc /target:library File.cs->在該目錄下產生一個對應名字的.dll文件(前提:把.cs文件放到握老C:WINDOWSMicrosoft.NETFrameworkv1.1.4322目錄下)
csc命令的方式很多,請參考以下,
------------------------------------
譯 File.cs 以產生 File.exe:
csc File.cs
編譯 File.cs 以產生 File.dll:段游升
csc /target:library File.cs
編譯 File.cs 並創建 My.exe:
csc /out:My.exe File.cs
通過使用優化和定義 DEBUG 符號,編譯當前目錄中所有的 C# 文件。輸出為 File2.exe:
csc /define:DEBUG /optimize /out:File2.exe *.cs
編譯當前目錄中所有的 C# 文件,以產生 File2.dll 的調試版本。不顯示任何徽標和警告:
csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs
將當前目錄中所有的 C# 文件編譯為 Something.xyz(一個 DLL):
csc /target:library /out:Something.xyz *.cs
編譯 File.cs 以產生 File.dll: csc /target:library File.cs這個就是我們使用最多的一個命令,其實可以簡單的寫成csc /t:library File.cs,另外的一個寫法是
csc /out:mycodebehind.dll /t:library mycodebehind.cs,這個可以自己指定輸出的文件名。
csc /out:mycodebehind.dll /t:library mycodebehind.cs mycodebehind2.cs,這個的作用是把兩個cs文件裝到一個.dll文件里。。。
『叄』 如何使用 Visual Studio.Net 編譯和執行 C# 程序,步驟是
啟動 Visual Studio。
在菜單欄上,選擇 File -> New -> Project。
從模板中選擇 Visual C#,然後選擇 Windows。
選擇 Console Application。
為的項目制定一個名稱,然後點擊 OK 按鈕。
新項目會出現在解決方案資源管理器(Solution Explorer)中。
在代碼編輯器(Code Editor)中編寫代碼。
點擊 Run 按鈕或者按下 F5 鍵來運行程序。會出現一個命令提示符窗口(Command Prompt window),顯示 Hello World。
您也可以使用命令行代替 Visual Studio IDE 來編譯 C# 程序:
打開一個文本編輯器,添加上面提到的代碼。
保存文件為 helloworld.cs。
打開命令提示符工具,定位到文件所保存的目錄。
鍵入 csc helloworld.cs 並按下 enter 鍵來編譯代碼。
如果代碼沒有錯誤,命令提示符會進入下一行,並生成 helloworld.exe 可執行文件。
接下來,鍵入 helloworld 來執行程序。
將看到 "Hello World" 列印在屏幕上。