首先引入命名空间
其次我们要了解CSharpCodeProvider这个类是用于动态编译c#程序集,它继承了ICodeCompiler
在使用动态编译前,应该先了解反射的相关知识
在动态编译时,提供了多种方式如下:
CompileAssemblyFromDom
使用指定的编译器设置从指定的 CodeCompileUnit 所包含的 System.CodeDom 树中编译程序集。
CompileAssemblyFromDomBatch
基于包含在 CodeCompileUnit 对象的指定数组中的 System.CodeDom 树,使用指定的编译器设置编译程序集。
CompileAssemblyFromFile
从包含在指定文件中的源代码,使用指定的编译器设置编译程序集。
CompileAssemblyFromFileBatch
从包含在指定文件中的源代码,使用指定的编译器设置编译程序集。
CompileAssemblyFromSource
从包含源代码的指定字符串,使用指定的编译器设置编译程序集。
CompileAssemblyFromSourceBatch
从包含源代码的字符串的指定数组,使用指定的编译器设置编译程序集。
在编译时,我们可以选择是exe或dll。当然,我们也可以只在内存编译,不用生成文件,程序集用完就可以释放。
下面是一个实例
下面我们来换成内存编译,用CompileAssemblyFromSource来编译
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
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
;
}
}
}
|