using System; using System.Collections.Generic; using System.Text; using Microsoft.Build.Utilities; using Indy.IL2CPU; using Microsoft.Build.Framework; using Cosmos.Build.Tasks.Properties; using System.IO; using System.Reflection; namespace Cosmos.Build.Tasks { public class IL2CPU : Task { private string[] plugs; /// /// Gets or sets the plugs files to include in the build. /// [Required] public string[] Plugs { get { return plugs; } set { plugs = value; } } private string sourceFile; /// /// Gets or sets the source assembly. /// public string SourceFile { get { return sourceFile; } set { sourceFile = value; } } public override bool Execute() { bool success = true; try { Engine e = new Engine(); e.DebugLog += new DebugLogHandler(e_DebugLog); string path = Path.GetTempFileName(); string asmDir = Path.Combine(Path.GetDirectoryName(sourceFile), "asm"); if (!Directory.Exists(asmDir)) Directory.CreateDirectory(asmDir); Func getFilenameForGroup = group => Path.Combine(asmDir, group + ".asm"); List ps = new List(plugs.Length); foreach (string item in plugs) ps.Add(item); e.Execute(sourceFile, TargetPlatformEnum.NativeX86, getFilenameForGroup, false, true, null, ps); } catch (ReflectionTypeLoadException e) { Log.LogError(null, "IL2", null, "IL2CPU", 0, 0, 0, 0, Resources.UnknownExceptionMessage, e.GetType().ToString()); for (int i = 0; i < e.LoaderExceptions.Length; i++) { Log.LogError(null, "IL2", null, "IL2CPU", 0, 0, 0, 0, Resources.UnknownExceptionMessage, e.LoaderExceptions[i].ToString()); Log.LogError(null, "IL2", null, "IL2CPU", 0, 0, 0, 0, Resources.UnknownExceptionMessage, e.StackTrace); } success = false; } catch (Exception e) { Log.LogError(null, "IL1", null, "IL2CPU", 0, 0, 0, 0, Resources.UnknownExceptionMessage, e.ToString()); Log.LogError(null, "IL2", null, "IL2CPU", 0, 0, 0, 0, Resources.UnknownExceptionMessage, e.StackTrace); success = false; } return success; } void e_DebugLog(LogSeverityEnum aSeverity, string aMessage) { switch (aSeverity) { case LogSeverityEnum.Error: Log.LogError(null, "IL0", null, "IL2CPU", 0, 0, 0, 0, aMessage); break; case LogSeverityEnum.Informational: //Log.LogMessage(MessageImportance.Normal, aMessage); Log.LogWarning(null, "IL0", null, "IL2CPU", 0, 0, 0, 0, aMessage); break; case LogSeverityEnum.Warning: Log.LogWarning(null, "IL0", null, "IL2CPU", 0, 0, 0, 0, aMessage); break; } } } }