熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

動態執行C#代碼

2022-06-13   來源: .NET編程 

  寫這篇筆記的理由是因為上篇g提高的工具LINQPad
  想用LINQ思考嗎?扔掉SQL查詢分析器Come on LINQPad!
  該工具的實現就有執行動態代碼的應用

  應用場景
  還沒想出來會用到哪裡動態的代碼由誰來寫?普通用戶我想有一定的困難
  特別是有了像 IronPython 這樣更容易使用的動態嵌入腳本

  ) 像 LINQPad 這樣的輔助開發工具
  ) 實現腳本引擎?
  ) 探討

  主要使用命名空間 MicrosoftCSharp 編譯C#代碼然後使用 CodeDom 和 反射調用我這裡寫了一個測試工具看代碼


   using System; using SystemCollectionsGeneric; using SystemComponentModel; using SystemDrawing; using SystemWindowsForms; using SystemCodeDomCompiler; using MicrosoftCSharp; // 用於編譯C#代碼 using SystemReflection; // 用於反射調用 namespace CodeDomLearn { public partial class Form : Form { public Form() { InitializeComponent(); } private void button_Click(object sender EventArgs e) { CodeCompilerCompile(new string[] { } textBoxText ); listBoxItemsClear(); foreach (string s in CodeCompilerErrorMessage) { listBoxItemsAdd(s); } listBoxItemsAdd(CodeCompilerMessage); } } static class CodeCompiler { static public string Message; static public List<string> ErrorMessage = new List<string>(); public static bool Compile(string[] references string source string outputfile) { // 編譯參數 CompilerParameters param = new CompilerParameters(references outputfile true); paramTreatWarningsAsErrors = false; paramGenerateExecutable = false; paramIncludeDebugInformation = true; // 編譯 CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerResults result = providerCompileAssemblyFromSource(param new string[] { source }); Message = ; ErrorMessageClear(); if (!resultErrorsHasErrors) { // 反射調用 Type t = resultCompiledAssemblyGetType(MyClass); if (t != null) { object o = resultCompiledAssemblyCreateInstance(MyClass); Message = (string)tInvokeMember(GetResult BindingFlagsInstance | BindingFlagsInvokeMethod | BindingFlagsPublic null o null); } return true; } foreach (CompilerError error in resultErrors) { // 列出編譯錯誤 if (errorIsWarning) continue; ErrorMessageAdd(Error( + errorErrorNumber + ) + errorErrorText + \t\tLine: + errorLineToString() + Column:+errorColumnToString()); } return false; } } }

  作為演示例子簡單的規定類名必須是MyClass必須有一個方法返回 string 類型的 GetResult 方法這是執行效果圖

  


From:http://tw.wingwit.com/Article/program/net/201311/12884.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.