導航:首頁 > 源碼編譯 > net怎麼編譯

net怎麼編譯

發布時間:2025-01-16 19:14:59

『壹』 詳解.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# 程序,步驟是

閱讀全文

與net怎麼編譯相關的資料

熱點內容
福昕pdf閱讀器刪除 瀏覽:436
app收集信息怎麼設置 瀏覽:288
python少兒編程圖 瀏覽:747
命令方塊解禁 瀏覽:930
海康威視伺服器地址和設備標識 瀏覽:298
做網站用php還是html 瀏覽:199
臉部識別演算法模型廠家 瀏覽:176
反編譯的程序帶注釋嗎 瀏覽:713
安裝軟體伺服器未響應怎麼解決 瀏覽:531
閥門開度單片機 瀏覽:568
python多線程有什麼坑 瀏覽:681
程序員從互聯網跳槽到銀行里 瀏覽:244
百度網盤資源解壓後暫不支持在線 瀏覽:220
android自動化環境 瀏覽:253
androidrealm加密 瀏覽:513
地圖正在解壓縮是什麼意思 瀏覽:217
電腦軟體能放在文件夾嗎 瀏覽:786
uc伺服器怎麼打開 瀏覽:363
net怎麼編譯 瀏覽:245
我的世界187伺服器地址ip 瀏覽:955