CodeDOM - Dynamisk generering og kompilering af kode

Relaterede dokumenter
SWC Elementer i klassedefinition

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

Singleton pattern i C#

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

Undtagelseshåndtering i C#

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

Introduction til.net remoting i C#

Indhold. Senest opdateret : 30. juli Side 1 af 5

Hvordan vælger jeg dokumentprofilen?

Software Construction 1 semester (SWC) Spørgsmål 1

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Indhold. Senest opdateret:03. september Side 1 af 8

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni jun 2011 MapBasic &.

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Anvendelse af metoder - Programmering

Singleton pattern i Java

Dvs. at give dit program muligheden for at loade og bruge plugins som andre har lavet.

Lektion 6. Grundlæggende programmering i VR

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Database for udviklere. Jan Lund Madsen PBS10107

Introduction til.net remoting i VB.NET

SWC eksamens-spørgsmål. Oversigt

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

Hvad er Objekter - Programmering

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

SAX Simple API for XML.

Udvikling af DOTNET applikationer til MicroStation i C#

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

Kapitel 1 I gang med C#

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

Plugin-arkitektur med.net

Klasser og objekter. (Afsnit i manualen)

Debugging ivs. Praksis eksempel. Assemblies Attributes Dynamic programming. Github. Multithreading. Grundlæggende programmering Lektion 6

Hvilket sprog er hurtigst

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

ATTRIBUTES MULTITHREADING DYNAMIC PROGRAMMING. Grundlæggende programmering Lektion 11

Tredjepart webservices

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

.NET 4.5 og C# 5.0. Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#.

Abstrakte datatyper C#-version

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Exceptions i Delphi. Try except

Spring Schema Extension eller Spring Domain Specific Languages

Java Klasse nedarvninger

Modern Concurrency Abstractions for C#

ODIN-webservice ændringer release 2010 v2.0

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Python 3 kursus lektion 1:

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Register-databasen med.net

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Privat-, statslig- eller regional institution m.v. Andet Added Bekaempelsesudfoerende: string No Label: Bekæmpelsesudførende

Lektion 4. Grundlæggende programmering i VR

Webserverprogrammering

Introduktion til AOP i C#

LØKKER METODER C S HISTORIE. Grundlæggende programmering Lektion 4

Det er muligt at chekce følgende opg. i CodeJudge: og

Programmering I Java/C#

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Databaseadgang fra Java

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Introduktion til ActionScript, fortsat

A Profile for Safety Critical Java

CHAPTER 8: USING OBJECTS

Objektorienteret Programmering

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

C# spil (del 1) - Kom i gang med et simpelt spil

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Cms-uafhængighed. Cms uafhængighed. Automatiseret kodegenerering Typestærkt datalag med auto completion og compile time-fejlhåndtering.

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Kontrol-strukturer i PHP

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Overblik. Class Loader. Java. Class Libraries. Bytecode. Verifier Java. Source (.java) Just in Time Compiler. Java

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Virkefeltsregler i Java

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Skriftlig eksamen i Datalogi

DANMARKS TEKNISKE UNIVERSITET

Tree klassen fra sidste forelæsning

Ivan Overgaard 11/29/2012

Delphi - CrackMe og Keygen

.NET Component Overview

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

XML parsning i Java. Denne artikel beskriver hvordan man parser XML i Java. Den beskriver W3C DOM, SAX og JDOM.

Test af It-komponent

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk CodeDOM - Dynamisk generering og kompilering af kode Med CodeDOM kan man på runtime generere kode, kompilere det og derefter afvikle det. I denne artikel skal vi kigge på hvordan... Skrevet den 01. Mar 2009 af wisen I kategorien Programmering /.NET Indledning Alle der har arbejdet en smule med.net platformen har næsten med sikkerhed hørt om WebServices og med næsten lige så stor sikkerhed prøvet at lave en WebService og benytte den i en eller anden klientapplikation. For at benytte en WebService i.net har man brug for en proxy klasse som man fra klientsiden kan instantiere og benytte som enhvert andet objekt - altså kalde dens metoder. Men hvordan kommer man fra at man trykket på "Add Web Reference" i Visual Studio, til der er genereret en proxyklasse? For at få genereret en proxyklasse skal man som bekendt angive hvilken Webservice man ønsker at konsumere ved at angive en URL til en.wsdl fil. Visual Studio kalder kommandolinie værktøjet WSDL.exe, som genererer proxyklassen, med den angivne.wsdl fil som argument. Ved at dissassemble WSDL.exe klassen kan man se at den benytter klassen System.Web.Services.Description.ServiceDescriptionImporter til at generere selve koden. MSDN har følgende eksempel på at benytte ServiceDescriptionImporter using System; using System.Web.Services.Description; using System.CodeDom; namespace MyServiceDescription class MyImporter public static void Main() try ServiceDescription myservicedescription = ServiceDescription.Read("Sample_CS.wsdl"); ServiceDescriptionImporter myimporter = new ServiceDescriptionImporter(); myimporter.protocolname = "Soap"; myimporter.addservicedescription(myservicedescription, "", ""); Console.WriteLine("Style: " + myimporter.style.tostring()); CodeNamespace mynamespace = new CodeNamespace(ServiceDescription.Namespace); CodeCompileUnit myunit = new CodeCompileUnit(); myunit.namespaces.add(mynamespace); ServiceDescriptionImportWarnings mywarning = myimporter.import(mynamespace, myunit); Console.WriteLine("ServiceDescriptionImportWarnings value generated: " + mywarning.tostring());

// Get the XMLSchema related to the ServiceDescriptionImporter. System.Xml.Serialization.XmlSchemas myschema = myimporter.schemas; catch (Exception e) Console.WriteLine("Following exception was thrown: " + e.tostring()); Langt det meste arbejde med at importere filen "Sample_CS.wsdl" sker i forbindelse med at Import metoden bliver kaldt på myimporter. Metoden tager, som det kan ses 2 argumenter - et CodeNamespace (mynamespace) og et CodeCompileUnit (myunit). Disse klasser er en del af CodeDOM. Vi kommer tilbage til hvad de kan bruges til, og selvfølgelig hvordan man bruger dem. Formålet med artiklen Formålet med denne artikel er at vise et eksempel på hvordan CodeDOM teknologien kan benyttes. Som altid når man begynder at kigge på en ny teknologi er der nærmest en konvention om at man laver et Hello World eksempel - så det skal vi selvfølgelig også her :) Hvad er CodeDOM så for en størrelse? CodeDOM teknologien kan f.eks. bruges til at lave kodegeneratorer som WSDL.exe som beskrevet i indledningen, en anden mulighed er at generere en assembly på runtime som varetager en eller anden, typisk krævende, opgave. Faktisk genererer XMLSerializeren en assembly på runtime i forbindelse med at man benytter WebServices - har I lagt mærke til at det tager 1-2 sekunder at instantiere en Webserviceproxy første gang? CodeDOM står er en forkortelse af "Code Document Object Model". CodeDOM'en er en træstruktur, en graf, der opbygges af et antal elementer fra CodeDOM-namespacet. CodeDOM'en er en abstraktion af et programmeringssprog - og dette er den primære fordel - man kan opbygge een CodeDOM som derefter kan realiseres i et, eller flere, konkrete programmeringssprog. CodeDOM namespacet indeholder klasser til at repræsentere langt de fleste kodemæssige konstruktioner man ellers kan lave ved at kode direkte i f.eks. C#. Der bl.a. findes klasser til at repræsentere type deklarationer, såsom klasser, member-variable (fields), metoder, properties, tildelinger, if-sætninger osv. osv. osv. Fordele ved CodeDOM - CodeDOM giver mulighed for at kode kan genereres, kompileres og afvikles på runtime. - CodeDOM giver mulighed for at generere kode for (principielt) alle.net sprog. Microsoft understøtter umiddelbart C#, VB.NET og JScript. Der findes også så vidt jeg ved også en CodeGenerator der kan emitte Delphi kode Begrænsninger ved CodeDOM - Ikke alle konstruktioner er mulige via CodeDOM. På MSDN står der "The CodeDOM supports the many common types of code elements found in programming languages that support the common language runtime. The CodeDOM was not designed to provide elements to represent all possible programming language features." Der findes nogle specielle klasser, f.eks. CodeSnippetStatement, som man kan benytte hvis man støder på en begrænsning ved CodeDOM'en. Via CodeSnippetXXX klasserne har man mulighed for at sætte kode direkte ind i outputtet:

CodeSnippetStatement literalstatement = new CodeSnippetStatement("Console.Write(\"Test literal statement output\")"); Hvis man putter ovenstående CodeSnippetStatement ind i sin CodeDOM vil man når CodeDOM'en emittes få skrevet "Console.Write(\"Test literal statement output\")". Dette har, som det sikkert kan ses, den ulempe at det ikke mere er muligt at tage en CodeDOM og emitte den til ethvert.net sprog. Da CodeSnippets er sprogspecifikke skal man, når man genererer CodeDOM'en, tage højde for hvilket sprog der skal outputtes til. Namespaces Der er specielt to namespaces man skal benytte når man vil arbejde med CodeDOM: - System.CodeDOM - indeholder de elementer der kan benyttes til at opbygge DOM'en - System.CodeDOM.Compiler - definerer bl.a. interfaces for generering og kompilering af kode Man benytter klassser fra System.CodeDOM til at opbygge strukturen, altså DOM'en og man benytter funktionalitet fra System.CodeDOM.Compiler namespacet for at outputte og kompilere kode udfra denne DOM. I System.CodeDOM.Compiler namespacet er der defineret to interfaces: - ICodeGenerator - definerer interfacet for klasser der kan generere kode udfra en CodeDOM - ICodeCompiler - definerer interfacet for klasser der kan benyttes til at kompilere kode I namespacet Microsoft.CSharp henholdsvis Microsoft.VisualBasic findes der en klasse (CSharpCodeProvider henholdsvis VBCodeProvider) der fungerer som factory af ICodeGenerator og ICodeCompiler implementationer for de respektive sprog. Hello world Målet med dette eksempel har været at komme omkring de fleste "almindelige" konstruktioner. Eksemplet går ud på at lave en forholdsvis simpel Hello World klasse som har en metode til at vise en messagebox, derudover har man mulighed for at ændre den besked den skal vise. Jeg har forsøgt at sætte relevante kommentarer ind for at koden bliver så forståelig som mulig - håber at det virker ;) Eksemplet kommer ind over klassedefinitioner, membervariable, properties, metoder, exceptions, tildeling af variable og properties osv. Instantiér et CodeCompileUnit Første trin er at lave et CodeCompileUnit: private static CodeCompileUnit CreateCompileUnit() // Create CompileUnit CodeCompileUnit compileunit = new CodeCompileUnit(); // Add references assemblies compileunit.referencedassemblies.add("system");

compileunit.referencedassemblies.add("system.windows.forms"); return compileunit; Tilføj et namespace Dernæst skal man tilføje et namespace vi kan putte klasser osv. ind i. Dette namespace skal tilføjes til det compileunit vi skabte ovenfor. private static CodeNamespace CreateNamespace( CodeCompileUnit compileunit ) // Create namespace CodeNamespace codenamespace = new CodeNamespace("HelloWorld"); // Add "using" statements codenamespace.imports.add( new CodeNamespaceImport("System") ); codenamespace.imports.add( new CodeNamespaceImport("System.Windows.Forms") ); // Add namespace to compileunit compileunit.namespaces.add( codenamespace ); return codenamespace; Definér en klasse Derefter kan vi definere en klasse "HelloWorldClass" som vi kan tilføje til namespacet: private static CodeTypeDeclaration CreateHelloWorldClass( CodeNamespace codenamespace ) // Create MyHelloWorldClass CodeTypeDeclaration classdeclaration = new CodeTypeDeclaration("HelloWorldClass"); classdeclaration.isclass = true; classdeclaration.attributes = MemberAttributes.Public; // Add class to namespace codenamespace.types.add( classdeclaration ); return classdeclaration; Tilføj en membervariabel Membervariable defineres ved at skabe instanser at CodeMemberField: private static void CreateFields(CodeTypeDeclaration classdeclaration)

// Create private field "m_message" CodeMemberField field = new CodeMemberField(typeof(string), "m_message"); field.attributes = MemberAttributes.Private; field.initexpression = new CodePrimitiveExpression("Hello world"); // Add field to class classdeclaration.members.add( field ); Tilføj en konstruktor En konstruktor defineres ved at skabe instanser af CodeConstructor. På denne instans kan der tilføjes kode i form af CodeStatements/CodeExpressions. private static void CreateConstructor(CodeTypeDeclaration classdeclaration) // Create constructor with parameters... CodeConstructor constructor = new CodeConstructor(); constructor.attributes = MemberAttributes.Public MemberAttributes.Final; //... add a string parameter "message" constructor.parameters.add( new CodeParameterDeclarationExpression(typeof(string), "message")); //.. if argument is null then return constructor.statements.add( new CodeConditionStatement( new CodeBinaryOperatorExpression( new CodeArgumentReferenceExpression("message"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)), new CodeStatement[] new CodeMethodReturnStatement() )); //... assign value of parameter "message" to field "m_message" constructor.statements.add( new CodeAssignStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), "m_message" ), new CodeArgumentReferenceExpression("message"))); //... add constructors to class classdeclaration.members.add( constructor ); Tilføj en property En property defineres ved at skabe en instans af CodeMemberProperty. En CodeMemberProperty har to CodeStatementCollections for henholdvis get og set delene, den har desuden to properties (HasGet og HasSet) der kan benyttes til at fortælle om den overholdet har en get henholdsvis set del - default er de begge true. private static void CreateProperty(CodeTypeDeclaration classdeclaration) // Create property to access private field... CodeMemberProperty property = new CodeMemberProperty();

property.name = "Message"; property.type = new CodeTypeReference(typeof(string)); property.attributes = MemberAttributes.Public MemberAttributes.Final; //... add setter property.setstatements.add( new CodeAssignStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), "m_message" ), new CodePropertySetValueReferenceExpression())); //... add getter property.getstatements.add( new CodeMethodReturnStatement( new CodeFieldReferenceExpression( new CodeThisReferenceExpression(), "m_message" ) )); //... add property to class classdeclaration.members.add( property ); Tilføj en metode Metoder defineres ved at skabe instanser af CodeMemberMethods: private static void CreateMethods(CodeTypeDeclaration classdeclaration) // Create method to show message... CodeMemberMethod method = new CodeMemberMethod(); method.name = "ShowMessage"; method.attributes = MemberAttributes.Public MemberAttributes.Final; //... if property is null throw exception method.statements.add( new CodeConditionStatement( new CodeBinaryOperatorExpression( new CodePropertyReferenceExpression( new CodeThisReferenceExpression(), "Message"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)), new CodeStatement[] new CodeThrowExceptionStatement( new CodeObjectCreateExpression(typeof(System.Exception), new CodeExpression[] new CodePrimitiveExpression("Message is null"))))); //... else add call to System.Windows.Forms.MessageBox.Show with property Message as argument method.statements.add( new CodeMethodInvokeExpression( new CodeTypeReferenceExpression( typeof(system.windows.forms.messagebox)), "Show", new CodeExpression[] new CodePropertyReferenceExpression( new CodeThisReferenceExpression(), "Message" ))); // Create overloaded method to show message... CodeMemberMethod overloadedmethod = new CodeMemberMethod(); overloadedmethod.name = "ShowMessage"; overloadedmethod.attributes = MemberAttributes.Public MemberAttributes.Final;

//... add parameter overloadedmethod.parameters.add( new CodeParameterDeclarationExpression(typeof(string), "message") ); //... if property is null throw exception overloadedmethod.statements.add( new CodeConditionStatement( new CodeBinaryOperatorExpression( new CodeArgumentReferenceExpression("message"), CodeBinaryOperatorType.ValueEquality, new CodePrimitiveExpression(null)), new CodeStatement[] new CodeThrowExceptionStatement( new CodeObjectCreateExpression(typeof(System.Exception), new CodeExpression[] new CodePrimitiveExpression("Message is null")))); //... else add call to System.Windows.Forms.MessageBox.Show with parameter as argument overloadedmethod.statements.add( new CodeMethodInvokeExpression( new CodeTypeReferenceExpression(typeof(System.Windows.Forms.MessageBox)), "Show", new CodeExpression[] new CodeArgumentReferenceExpression("message"))); //... add method to class classdeclaration.members.add( method ); classdeclaration.members.add( overloadedmethod ); Tilføj et EntryPoint Som bekendt skal der i enhver assembly være et EntryPoint - sådan et defineres ved at skabe en instans af CodeEntryPointMethod. private static void CreateEntryPoint( CodeTypeDeclaration classdeclaration ) // Create entry point CodeEntryPointMethod entrypoint = new CodeEntryPointMethod(); // Add entry point to class classdeclaration.members.add( entrypoint ); // Create a try-catch block CodeTryCatchFinallyStatement trycatch = new CodeTryCatchFinallyStatement(); // Add try-catch block to entrypoint entrypoint.statements.add( trycatch ); // Create instance of HelloWorldClass and assign it to a variable "helloworldclass" trycatch.trystatements.add( new CodeVariableDeclarationStatement("HelloWorldClass", "helloworldclass", new CodeObjectCreateExpression("HelloWorldClass", new CodeExpression[] new CodePrimitiveExpression(null) )) ); // Invoke ShowMessage method of HelloWorldClass

trycatch.trystatements.add( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("helloWorldClass"), "ShowMessage", new CodeExpression[0]) ); // Set property Message of HelloWorldClass - set to "Hej Verden" trycatch.trystatements.add( new CodeAssignStatement( new CodePropertyReferenceExpression( new CodeVariableReferenceExpression("helloWorldClass"), "Message"), new CodePrimitiveExpression("Hej Verden")) ); // Invoke ShowMessage method of HelloWorldClass trycatch.trystatements.add( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("helloWorldClass"), "ShowMessage", new CodeExpression[0]) ); // Invoke ShowMessage method of HelloWorldClass with argument "Hello World" trycatch.trystatements.add( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("helloWorldClass"), "ShowMessage", new CodeExpression[] new CodePrimitiveExpression("Hello World") ) ); // Create an catch clause... CodeCatchClause catchclause = new CodeCatchClause("e", new CodeTypeReference(typeof(System.Exception))); catchclause.statements.add( new CodeMethodInvokeExpression( new CodeTypeReferenceExpression(typeof(System.Windows.Forms.MessageBox)), "Show", new CodeExpression[] new CodePropertyReferenceExpression( new CodeArgumentReferenceExpression("e"), "Message") )); // Add catch clause to try-catch block trycatch.catchclauses.add( catchclause ); Kodegenerering - ICodeGenerator Som beskrevet ovenfor kan man via Microsoft.CSharp.CSharpCodeProvider få fat i en ICodeGenerator som kan emitte et CodeCompileUnit til en fil: private static void GenerateCode(CodeCompileUnit compileunit) // Create code from compileunit... CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); ICodeGenerator codegenerator = provider.creategenerator(); CodeGeneratorOptions generatoroptions = new CodeGeneratorOptions(); generatoroptions.bracingstyle = "C"; IndentedTextWriter writer = new IndentedTextWriter( new System.IO.StreamWriter("HelloWorld.cs", false), " "); codegenerator.generatecodefromcompileunit( compileunit, writer,

generatoroptions ); writer.close(); Kompilering - ICodeCompiler Ligesom ved generering af koden kan man via Microsoft.CSharp.CSharpCodeProvider få fat i en ICodeCompiler som kan kompilere den fil vi har genereret ovenfor: private static void CompileCode() // Compile code... CodeDomProvider provider = new Microsoft.CSharp.CSharpCodeProvider(); ICodeCompiler codecompiler = provider.createcompiler(); CompilerParameters compileroptions = new CompilerParameters(); compileroptions.referencedassemblies.add("system.dll"); compileroptions.referencedassemblies.add("system.windows.forms.dll"); compileroptions.generateinmemory = false; compileroptions.generateexecutable = true; compileroptions.outputassembly = "C:\\HelloWorld.exe"; CompilerResults compilerresults = codecompiler.compileassemblyfromfile(compileroptions, "HelloWorld.cs"); Putting it all together Så mangler vi bare at sætte det hele sammen: public static CodeCompileUnit dostuff() CodeCompileUnit compileunit = CreateCompileUnit(); CodeNamespace codenamespace = CreateNamespace( compileunit ); CodeTypeDeclaration classdeclaration = CreateHelloWorldClass( codenamespace ); CreateFields(classDeclaration); CreateConstructor(classDeclaration); CreateProperty(classDeclaration); CreateMethods(classDeclaration); CreateEntryPoint(classDeclaration); GenerateCode( compileunit ); CompileCode(); Resultatet

Herunder er resultatet fra genereringen: namespace HelloWorld using System; using System.Windows.Forms; public class HelloWorldClass private string m_message = "Hello world"; public HelloWorldClass(string message) if ((message == null)) return; this.m_message = message; public string Message get return this.m_message; set this.m_message = value; public void ShowMessage() if ((this.message == null)) throw new System.Exception("Message is null"); System.Windows.Forms.MessageBox.Show(this.Message); public void ShowMessage(string message) if ((message == null)) throw new System.Exception("Message is null"); System.Windows.Forms.MessageBox.Show(message); public static void Main() try

HelloWorldClass helloworldclass = new HelloWorldClass(null); helloworldclass.showmessage(); helloworldclass.message = "Hej Verden"; helloworldclass.showmessage(); helloworldclass.showmessage("hello World"); catch (System.Exception e) System.Windows.Forms.MessageBox.Show(e.Message); Referencer <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconcodedomquickr eference.asp">codedom Quick Reference</a> Kommentar af burningice d. 03. Nov 2004 1 Kommentar af edutasia d. 20. Apr 2005 2 Kommentar af williamengbjerg d. 05. Nov 2004 3 sejt..