//---------------------------------------------------------------------------------------------------------------------------------------------------
//
// Copyright (C)2007 DarkWynter Studios. All rights reserved.
//
//---------------------------------------------------------------------------------------------------------------------------------------------------
// {Contact : darkwynter.com for licensing information
//---------------------------------------------------------------------------------------------------------------------------------------------------
namespace DarkWynter.Engine.Compiler
{
#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Runtime.CompilerServices;
using System.Reflection;
using Microsoft.CSharp;
using System.Security;
using System.Security.Permissions;
using System.IO;
#endregion
///
/// Creates a CSharpCompiler for use in game
///
public class CSharpCompiler
{
public static object Execute(string source,
string className,
string functionName,
object[] parameters)
{
CompilerResults compilerResults = CompileCode(source);
if (compilerResults.Errors.Count > 0)
{
throw new Exception("Not a valid assembly");
}
return Execute(compilerResults.CompiledAssembly, className, functionName, parameters);
}
///
///
///
///
///
///
///
public static object Execute(Assembly a,
// string className,
// string functionName,
object[] parameters,
ref object callingObject)
{
object obj = null;
Type type = a.GetType();
foreach (Type tempType in a.GetTypes())
{
type = tempType;
try
{
foreach (MethodInfo info in type.GetMethods())
{
Array tempArray = info.GetParameters();
if (info.GetParameters().Length == 0)
{
if (obj == null)
{
obj = Activator.CreateInstance(type);
info.Invoke(obj, null);
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
return obj;
}
///
///
///
///
///
///
///
///
public static object Execute(Assembly assembly, string className, string functionName, object[] parameters)
{
object o = null;
return Execute(assembly, parameters, ref o);
}
///
///
///
///
///
public static CompilerResults CompileCode(String source)
{
CodeDomProvider provider = new CSharpCodeProvider();
// Set Compile parameters
CompilerParameters compilerParameters = new CompilerParameters();
compilerParameters.GenerateExecutable = false;
compilerParameters.GenerateInMemory = true;
compilerParameters.IncludeDebugInformation = false;
//// Create CodeDom Source-Tree
//ICodeGenerator cg = provider.CreateGenerator();
//// Create Namespace
//CodeNamespace cnamespace = new CodeNamespace("Microsoft.Samples");
//cnamespace.Imports.Add (new CodeNamespaceImport ("System") );
//// Create a DataType
//CodeTypeDeclaration co = new CodeTypeDeclaration (typeName +"List");
//co.IsClass = true;
//cnamespace.Types.Add (co);
//// Generate Source Code
//cg.GenerateCodeFromNamespace(cnamespace, w, null);
// Add an assembly reference.
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly entryAssembly = Assembly.GetEntryAssembly();
foreach (AssemblyName assemblyName in
executingAssembly.GetReferencedAssemblies())
{
//if (assemblyName.Name == "DWApplication" || assemblyName.Name == "DWGame" || assemblyName.Name == "DWEngine" || assemblyName.Name == "DWStream")
//{
compilerParameters.ReferencedAssemblies.Add(assemblyName.Name + ".dll");
//}
}
compilerParameters.ReferencedAssemblies.Add("DWEngine.dll");
compilerParameters.ReferencedAssemblies.Add("DWGame.dll");
compilerParameters.ReferencedAssemblies.Add("DWContent.dll");
compilerParameters.ReferencedAssemblies.Add("DWApplication.dll");
// compilerParameters.ReferencedAssemblies.Add("DarkWynterGame" + ".dll");
// Set the level at which the compiler
// should start displaying warnings.
compilerParameters.WarningLevel = 3;
// Set whether to treat all warnings as errors.
compilerParameters.TreatWarningsAsErrors = false;
// Set compiler argument to optimize output.
compilerParameters.CompilerOptions = "/optimize";
// Invoke compilation.
CompilerResults compilerResults = provider.CompileAssemblyFromSource(
compilerParameters, new string[] { source });
return compilerResults;
//}
}
}
}