最近想学学C#,简单看了一下语法,对当年远控能够直接生成exe文件的功能比较好奇,想要一探究竟,竟然发现C#中可以直接编译C#代码成dll或者exe文件。(类似PHP中的eval,只不过PHP属于解释型语言,只要一个函数便可执行代码,但编译型语言中想要执行代码必须先编译,所以才有了程序中将其他的代码编译的需求)
在网上简单找了一下,发现好多文件里都是一样的示例代码,示例中演示里如何编译成DLL文件并且进行调用,我稍加改动,编译成了exe文件。
代码如下:
using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
namespace eval//编译C#代码为EXE/DLL
{
class Program
{
static void Main(string[] args)
{
CreateCodeDll1();
Console.Read();
}
public static void CreateCodeDll1()
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.GenerateInMemory = false;
string path = "test.exe";
parameters.OutputAssembly = path;
parameters.ReferencedAssemblies.Add("System.dll");
string sourceFile = @"
using System;
public class MyCode
{
public static void Main(string[] args)
{
Console.Write(""i'm running!"");
Console.Read();
}
}
";
CompilerResults cr = provider.CompileAssemblyFromSource(parameters, sourceFile);
if (cr.Errors.Count > 0)
{
Console.Write("Errors building " + sourceFile + " into " + cr.PathToAssembly);
foreach (CompilerError ce in cr.Errors)
{
Console.Write(ce.ToString());
}
}
else
{
Console.Write("编译成功");
}
Console.Read();
}
}
}
其中parameters.ReferencedAssemblies.Add("System.dll");这里注意是system.dll,网上的代码都是system,实测报错,必须加上.dll。
如果要编译DLL文件,parameters.GenerateExecutable = true;这里的true要改成false