Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1563 | Anzahl registrierter User: 1895 | Besucher online: 170
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Kompilierung zur Laufzeit


Autor: Günther Foidl
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 9897
  
Kick it on dotnet-kicks.de  

Beschreibung:

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.


Abgelegt unter: Kompilierung, Kompilierung zur Laufzeit, Codeerstellung, Reflection.



C#
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
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;
		}
	}
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)



schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.