在開始以前,先熟悉幾個類及部分屬性、方法:
CSharpCodeProvider、
ICodeCompiler、
CompilerParameters、
CompilerResults、
Assembly。
1、CSharpCodeProvider
提供對C#代碼生成器和代碼編譯器的實例的訪問。若是要動態生成VB代碼,能夠使用
VBCodeProvider。
CreateCompiler():獲取編譯器的實例。
2、ICodeCompiler
定義用於調用源代碼編譯的接口或使用指定編譯器的
CodeDOM樹。每種編譯方法都接受指示編譯器的
CompilerParameters對象,並返回指示編譯結果的
CompilerResults對象。
CompilerAssemblyFromSource(CompilerParameters option, string source):使用指定的編譯器,從包含源代碼的字符串設置編譯程序集。
3、CompilerParameters
表示用於調用編譯器的參數。
ReferencedAssemblies:獲取當前項目所引用的程序集。
Add方法爲程序集添加引用。
GenerateExecutable:獲取或設置一個值,該值指示是否生成可執行文件。若此屬性爲false,則生成DLL,默認是false。
GenerateInMemory:獲取或設置一個值,該值指示是否在內存中生成輸出。
4、CompilerResults
表示從編譯器返回的編譯結果。
CompiledAssembly:獲取或設置以編譯的程序集,Assembly類型。
5、Assembly
就是程序集了(不知道如何描述了)。
大體瞭解了以上知識以後,就能夠使用C#動態的編譯並執行代碼了,一下是一段示例程序:
using
System;
using
System.Reflection;
using
System.Globalization;
using
Microsoft.CSharp;
using
System.CodeDom;
using
System.CodeDom.Compiler;
using
System.Text;
namespace
ConsoleApplication1
{
public
class
Program
{
static
void
Main(
string
[] args)
{
//
1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder
=
new
CSharpCodeProvider();
//
2.ICodeComplier
ICodeCompiler objICodeCompiler
=
objCSharpCodePrivoder.CreateCompiler();
//
3.CompilerParameters
CompilerParameters objCompilerParameters
=
new
CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add(
"
System.dll
"
);
objCompilerParameters.GenerateExecutable
=
false
;
objCompilerParameters.GenerateInMemory
=
true
;
//
4.CompilerResults
CompilerResults cr
=
objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());
if
(cr.Errors.HasErrors)
{
Console.WriteLine(
"
編譯錯誤:
"
);
foreach
(CompilerError err
in
cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
}
else
{
//
經過反射,調用HelloWorld的實例
Assembly objAssembly
=
cr.CompiledAssembly;
object
objHelloWorld
=
objAssembly.CreateInstance(
"
DynamicCodeGenerate.HelloWorld
"
);
MethodInfo objMI
=
objHelloWorld.GetType().GetMethod(
"
OutPut
"
);
Console.WriteLine(objMI.Invoke(objHelloWorld,
null
));
}
Console.ReadLine();
}
static
string
GenerateCode()
{
StringBuilder sb
=
new
StringBuilder();
sb.Append(
"
using System;
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
namespace DynamicCodeGenerate
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
{
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
public class HelloWorld
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
{
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
public string OutPut()
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
{
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
return \
"
Hello world
!
\
"
;
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
}
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
}
"
);
sb.Append(Environment.NewLine);
sb.Append(
"
}
"
);
string
code
=
sb.ToString();
Console.WriteLine(code);
Console.WriteLine();
return
code;
}
}
}