Upload
jonah-contreras
View
12
Download
0
Embed Size (px)
DESCRIPTION
Compilerbau. .NET Compiler / Codegeneratoren / Skriptsprachen. Inhalt. Skriptsprachen Motivation Codegenerierung mit CodeDom Codemodifizierung mit Reflections Codekompilierung Eigene C# Scriptsprache Demos. Skriptsprachen. Clientseitig JavaScript VBScript Serverseitig PHP Perl - PowerPoint PPT Presentation
Citation preview
Dipl. Inf. (FH) Paul MizelEmail: [email protected]
Compilerbau.NET Compiler / Codegeneratoren / Skriptsprachen
Inhalt
SkriptsprachenMotivationCodegenerierung mit CodeDomCodemodifizierung mit ReflectionsCodekompilierungEigene C# ScriptspracheDemos
Skriptsprachen
Clientseitig JavaScript VBScript
Serverseitig PHP Perl Python
Anwendungen Lua – Wird in Spiel-Entwicklung eingesetzt REXX – Skriptsprache von IBM
Motivation
Code Generierung aus dem Code heraus?!?!? in verschiedene .NET Sprachen.
using System.CodeDom;
Wie kann ich Bibliothekencode Dekompilieren und Modifizieren?using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom;
Wie kann ich mit .NET Kompilieren?using Microsoft.CSharp;
Wie erzeuge ich eigene Scriptsprache?using Microsoft.CSharp;
Codegenerierung namespace XYZ {
public class YZX{
public static void Main(){
string data=„xyz“;System.Console.WriteLine(data);
}}
}
CodeNamespace
CodeTypeDeclaration Type:Add
CodeEntryPointMethod Members:Add
CodeVariableDeclarationStatement Statements:AddCodeMethodInvokeExpression Statements:Add
Codegenerierung
System.CodeDom
.NET TypengleichheitCodeVariableDeclarationStatement strDecl = new CodeVariableDeclarationStatement(
new CodeTypeReference(typeof(string)), “msg");
mainMethod.Statements.Add(strDecl);
CodeAssignStatement ptxAssign = new CodeAssignStatement(new CodeVariableReferenceExpression(„msg"),
new CodeSnippetExpression("\"hello world\""));
mainMethod.Statements.Add(ptxAssign);
CodeMethodInvokeExpression invokeConsoleWriteLine = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Console)), "WriteLine", new CodeExpression[] { new CodeArgumentReferenceExpression(„msg"), });
mainMethod.Statements.Add(invokeConsoleWriteLine);
string msg;msg = "hello world";System.Console.WriteLine(message);
Disassemblierung Modifizierung
System.Reflection (read)System.Reflection.FieldInfo[] fia = (object)o.GetType().GetFields();
System.CodeDom (write)Codegenerierung
Object.GetType()Type.GetFields()
FieldInfo[]
Codekompilieren im Speicherpublic void Start(string code){ CSharpCodeProvider c = new CSharpCodeProvider();CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");cp.ReferencedAssemblies.Add("System.Data.dll");cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
cp.GenerateExecutable = true;cp.GenerateInMemory = true;CompilerResults r = c.CompileAssemblyFromSource(cp, code);
System.String[] scriptArgs = new System.String[1];r.CompiledAssembly.EntryPoint.Invoke(null, scriptArgs);}
C# als Skriptsprache
Interfacepublic interface IScript
{
int main(out object output, params object[] input);
}
Scriptusing xyz;
namespace Compilerbau
{public class FILENAME : IScript
{
MAIN_CODE
}
}
Beispiel für MAIN_CODE
window.scriptpublic int main(out object output, params object[] input)
{
output =(object)"Windows Beispiel";
Win w = new Win();
w.Text="Compilerbau";
w.Show();
return 0;
}
public class Win : Form{}
Was am Ende stehtusing xyz;
namespace Compilerbau{
public class FILENAME : IScript{
//MAIN_CODE_BEGINpublic int main(out object output, params object[] input)
{ output =(object)"Windows Beispiel";
Win w = new Win();w.Text="Compilerbau";
w.Show(); return 0;}
public class Win : Form{}//MAIN_CODE_END
}}
DEMO
CodeCompiler CodeGenerierung CodeDekomilierung SkriptLive C# als Skriptsprache
Inhaltsverzeichnis
Microsoft MSDNmsdn.microsoft.com
Code Generation in multiple languages blogs.msdn.com/abhinaba/archive/2006/02/27/539702.aspx
C#: Writing extendable applications using on-the-fly compilation blogs.msdn.com/abhinaba/archive/2006/02/09/528416.aspx