summaryrefslogtreecommitdiff
path: root/CompileScript.cs
blob: cbdb5b83f91eb857ce1e2a8a9fbba74dc977f8de (plain)
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SIDFX
// Copyright (C) 2004  Ian Cowburn
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// $Id$
//
using System;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;

namespace SIDFX
{
	/// <summary>
	/// Description of CompileScript.	
	/// </summary>
	public class CompileScript
	{
		// -------------------------------------------------------
		// PUBLIC
		// -------------------------------------------------------

		public CompileScript(string script)
		{
			try
			{
				script="using System;using SIDFX;\nusing System.Threading;\nclass Script { public void Main() {\n"+script;
				script=script+"}}";
				
				m_provider=new CSharpCodeProvider();
				m_compiler=m_provider.CreateCompiler();
				m_param=new CompilerParameters();
				
				m_param.GenerateExecutable=false;
				m_param.GenerateInMemory=true;
				m_param.OutputAssembly=null;
				m_param.MainClass="Script.Main";
				m_param.IncludeDebugInformation=false;

				foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
					m_param.ReferencedAssemblies.Add(a.Location);
				}
			
				m_results=m_compiler.CompileAssemblyFromSource(m_param,script);
			}
			catch
			{
				throw;				
			}
		}

		public bool HasErrors
		{
			get
			{
				if (m_results!=null)
				{
					return m_results.Errors.Count>0;
				}
				else
				{
					return true;
				}
			}
		}
		
		public CompilerErrorCollection Errors
		{
			get {return m_results.Errors;}
		}
		
		public void Run()
		{
			if (!HasErrors)
			{
				object o = m_results.CompiledAssembly.CreateInstance("Script");
				Type type = o.GetType();
				MethodInfo m = type.GetMethod("Main");
				m.Invoke(o, null);
			}
		}

		// -------------------------------------------------------
		// PRIVATE
		// -------------------------------------------------------
		private CSharpCodeProvider	m_provider=null;		
		private ICodeCompiler		m_compiler=null;
		private CompilerParameters	m_param=null;
		private CompilerResults		m_results=null;
	}
}