您好,登錄后才能下訂單哦!
這篇文章主要介紹“編譯C#代碼的應用方法是什么”,在日常操作中,相信很多人在編譯C#代碼的應用方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”編譯C#代碼的應用方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
編譯C#代碼應用場景:
還沒想出來會用到哪里。動態的代碼由誰來寫?普通用戶我想有一定的困難。特別是有了像 IronPython 這樣更容易使用的動態嵌入腳本。
1) 像 LINQPad 這樣的輔助開發工具
2) 實現腳本引擎?
3) 探討...
主要使用命名空間 Microsoft.CSharp 編譯C#代碼,然后使用 CodeDom 和 反射調用,我這里寫了一個測試工具,看代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using Microsoft.CSharp; // 用于編譯C#代碼
using System.Reflection; // 用于反射調用
namespace CodeDomLearn
{
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
CodeCompiler.Compile(new string[] { }, textBox1.Text, "");
listBox1.Items.Clear();
foreach (string s in CodeCompiler.ErrorMessage) {
listBox1.Items.Add(s);
}
listBox1.Items.Add(CodeCompiler.Message);
}
}
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);param.TreatWarningsAsErrors = false;
param.GenerateExecutable = false;
param.IncludeDebugInformation = true;
// 編譯
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerResults result = provider.CompileAssemblyFromSource
(param, new string[] { source });
Message = "";
ErrorMessage.Clear();
if (!result.Errors.HasErrors) { // 反射調用
Type t = result.CompiledAssembly.GetType("MyClass");
if (t != null) {
object o = result.CompiledAssembly.CreateInstance("MyClass");
Message = (string)t.InvokeMember("GetResult", BindingFlags.Instance |
BindingFlags.InvokeMethod | BindingFlags.Public, null, o, null);}
return true;
}
foreach (CompilerError error in result.Errors) { // 列出編譯錯誤
if (error.IsWarning) continue;
ErrorMessage.Add("Error(" + error.ErrorNumber + ") - " + error.ErrorText +
"\t\tLine:" + error.Line.ToString() + " Column:"+error.Column.ToString());}
return false;
}
}
}
作為演示,例子簡單的規定類名必須是MyClass,必須有一個方法返回 string 類型的 GetResult 方法。
到此,關于“編譯C#代碼的應用方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。