Unter der Annahme, dass Sie eine Reihe von C#-Codebrüitten haben, die als Textdateien oder Eingabestreams gespeichert sind. Können wir also den traditionellen Kompilierungsprozess umgehen, diese Fragmente dynamisch kompilieren und ausführen?
In der Welt der C#und der statischen .NET -Sprache ist CodedOM (Code -Dokumentobjektmodell) der Schlüssel zur Lösung dieses Problems. Die Verwendung ist nicht auf die Konstruktion dynamischer Code beschränkt, sondern kompiliert auch Codefragmente oder ganze Klassen während der Laufzeit.
Beispiel: Verwenden Sie codedom, um das Codefragmentzu kompilieren
Die folgenden C# -Codefragmente zeigen, wie Sie codedom für dynamische Codekompilien verwenden:
Der Code, der ausgeführt und kompiliert
using Microsoft.CSharp; using System.Collections.Generic; using System.CodeDom.Compiler; using System.Linq; class Program { static void Main(string[] args) { // 创建C#代码提供程序并设置编译参数 var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.exe", true); parameters.GenerateExecutable = true; // 从源字符串编译代码 CompilerResults results = csc.CompileAssemblyFromSource(parameters, @"using System.Linq; class Program { public static void Main(string[] args) { var q = from i in Enumerable.Range(1,100) where i % 2 == 0 select i; foreach(var item in q) Console.WriteLine(item); } }"); // 处理编译错误 if (results.Errors.HasErrors) { foreach (CompilerError error in results.Errors) { Console.WriteLine(error.ErrorText); } } } }
<论> Schlussfolgerung:
codedom bietet eine leistungsstarke Plattform für die dynamische Kompilierung und Ausführung von C#-Codfragment. Während der Erfüllung der Anforderungen an Zusammenstellung und Leistung auch die Vorteile der Definition benutzerdefinierter Schnittstellen für das Codesegment bietet. Es ist zu beachten, dass die Verwendung von <在> in einer neueren .NET -Version aufgegeben wurde.
// 加载编译后的程序集 var assembly = Assembly.LoadFrom("foo.exe"); // 获取要执行的类型和方法 var type = assembly.GetType("Program"); var mainMethod = type.GetMethod("Main"); // 调用方法 mainMethod.Invoke(null, new object[] { new string[] { } });
Das obige ist der detaillierte Inhalt vonKönnen C -Code -Fragmente dynamisch kompiliert und ausgeführt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!