Feedback

C# - Kompilierung zur Laufzeit

Veröffentlicht von am 07.10.2008
(2 Bewertungen)
Manchmal kann es nützlich sein Code zur Laufzeit zu kompilieren und diesen gleich zu verwenden.

Beispiele wären eine Skript-Implementierung oder die Auswertung von Formeln.

Das im Snippert dargestellte Beispiel ist bewusst einfach gehalten und verkettet nur den Eingabestring der Methode mit sich selbst.

Funktionieren tut das ganze wie eine normales Kompilierung nur dass die erstellte Assembly direkt im Speicher behalten wird und per Reflektion darauf zugegriffen werden kann.
GFU-Schulungen  [Anzeige]

Visual Studio Team Foundation Server 2017/2015 (TFS) für Entwickler - Kompakt

Nach Teilnahme an dieser Schulung kennen Sie alle wesentlichen Funktionen des TFS für Entwickler. Sie setzen Software-Entwicklung mit dem Visual Studio Team Foundation Server erfolgreich um.

C# Komplett

Sie kennen sich in objektorientierter Programmierung aus. Sie schreiben C++ oder Java? Und nun stehen Sie vor der Aufgabe, in C# Anwendungen zu erstellen. Das C# Komplett-Seminar verschafft Ihnen umfassende Programmierkenntnisse in dieser Sprache. Nach der Schulung entwickeln Sie selbständig Anwendungen mit C#. Sie kennen die Datentypen und Klassenbibliotheken der objektorientierten Programmiersprache C#. Der Komplettkurs setzt bei den Grundlagen von C# ein. Sie arbeiten mit Variablen und konvertieren Typen. Multithreading, Delegates, Generics sind nach dem Seminar für Sie kein Geheimnis mehr.

using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;

namespace Code_zur_Laufzeit_erzeugen
{
	class Program
	{
		static void Main(string[] args)
		{
			Console.Write("Enter text -> ");
			string textInput = Console.ReadLine();

			Assembly assembly = CompileCode(textInput);
			object o = assembly.CreateInstance("gfoidl.Code.Test");
			Type t = o.GetType();
			MethodInfo mi = t.GetMethod("Ergebnis");
			object result = mi.Invoke(o, new object[] { textInput });
			Console.WriteLine(result);

			Console.ReadKey();
		}
		//---------------------------------------------------------------------
		public static Assembly CompileCode(string inputCode)
		{
			CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

			CompilerParameters cp = new CompilerParameters();
			cp.ReferencedAssemblies.Add("system.dll");
			cp.CompilerOptions = "/t:library";
			cp.GenerateInMemory = true;

			StringBuilder sb = new StringBuilder();
			sb.AppendLine(@"using System;");
			sb.AppendLine(@"namespace gfoidl.Code{");
			sb.AppendLine(@"public class Test{");
			sb.AppendLine(@"public string Ergebnis(string input){");
			sb.AppendLine(@"return input + ""\t"" + input;");
			sb.AppendLine(@"}}}");

			CompilerResults cr =
				provider.CompileAssemblyFromSource(cp, sb.ToString());

			if (cr.Errors.Count > 0)
			{
				Console.WriteLine(cr.Errors[0].ErrorText);
				return null;
			}

			return cr.CompiledAssembly;
		}
	}
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!