编译C#代码
2020-01-15 05:22
183 查看
using Microsoft.CSharp; using System.CodeDom.Compiler; using System.Reflection; using System.Text; namespace System { public static class CompileCSCAtRuntime { public static void HelloWorld() { string code = @" using System; namespace First { public class Program { public static void Main() { " + "Console.WriteLine(\"Hello, world!\");" + @" } } } "; CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerParameters parameters = new CompilerParameters(); // Reference to System.Drawing library parameters.ReferencedAssemblies.Add("System.Drawing.dll"); // True - memory generation, false - external file generation parameters.GenerateInMemory = true; // True - exe file generation, false - dll file generation parameters.GenerateExecutable = true; CompilerResults results = provider.CompileAssemblyFromSource(parameters, code); if (results.Errors.HasErrors) { StringBuilder sb = new StringBuilder(); foreach (CompilerError error in results.Errors) { sb.AppendLine(String.Format("Error ({0}): {1}", error.ErrorNumber, error.ErrorText)); } throw new InvalidOperationException(sb.ToString()); } Assembly assembly = results.CompiledAssembly; Type program = assembly.GetType("First.Program"); MethodInfo main = program.GetMethod("Main"); main.Invoke(null, null); } public static void TestMeothds() { MethodInfo function = CreateFunction("x + 2 * y"); var betterFunction = (Func<double, double, double>)Delegate.CreateDelegate(typeof(Func<double, double, double>), function); Func<double, double, double> lambda = (x, y) => x + 2 * y; DateTime start; DateTime stop; double result; int repetitions = 5000000; start = DateTime.Now; for (int i = 0; i < repetitions; i++) { result = OriginalFunction(2, 3); } stop = DateTime.Now; Console.WriteLine("Original - time: {0} ms", (stop - start).TotalMilliseconds); start = DateTime.Now; for (int i = 0; i < repetitions; i++) { result = (double)function.Invoke(null, new object[] { 2, 3 }); } stop = DateTime.Now; Console.WriteLine("Reflection - time: {0} ms", (stop - start).TotalMilliseconds); start = DateTime.Now; for (int i = 0; i < repetitions; i++) { result = betterFunction(2, 3); } stop = DateTime.Now; Console.WriteLine("Delegate - time: {0} ms", (stop - start).TotalMilliseconds); start = DateTime.Now; for (int i = 0; i < repetitions; i++) { result = lambda(2, 3); } stop = DateTime.Now; Console.WriteLine("Lambda - time: {0} ms", (stop - start).TotalMilliseconds); } public static double OriginalFunction(double x, double y) { return x + 2 * y; } public static MethodInfo CreateFunction(string function) { string code = @" using System; namespace UserFunctions { public class BinaryFunction { public static double Function(double x, double y) { return func_xy; } } } "; string finalCode = code.Replace("func_xy", function); CSharpCodeProvider provider = new CSharpCodeProvider(); CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), finalCode); Type binaryFunction = results.CompiledAssembly.GetType("UserFunctions.BinaryFunction"); return binaryFunction.GetMethod("Function"); } } }
转载于:https://www.cnblogs.com/babietongtianta/p/6145624.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 如何用C#动态编译、执行代码
- 如何用C#动态编译、执行代码
- javascript转c#神器--JS编译成c#代码软件---JS生成c#DLL软件
- C#代码的编译过程
- [转]用C#动态编译、执行代码
- c# il (中间代码)exe,dll(编译成的程序) 之间的转换
- 如何用C#动态编译、执行代码
- C#代码的编译与执行过程(摘自ms inside c#)
- [CLR via C#]1.1 将源代码编译成托管代码
- C#代码动态编译、动态执行、动态调试
- CSC.exe编译C#代码
- 如何用C#动态编译、执行代码
- 用C#代码编译另一个.net工程
- C#动态编译代码
- 如何用C#动态编译、执行代码
- 如何用C#动态编译、执行代码
- 编译C#代码
- 如何在 Visual Studio 中混合编译C# 和 C++代码,生成单一的DLL?
- C#中的委托和事件 (4)---事件和委托的编译代码
- C#代码动态编译、动态执行、动态调试(转载)