public bool BuildProjectFile(string projectFileName, string[] targetNames, IDictionary globalProperties, IDictionary targetOutputs, string toolsVersion) { if (String.IsNullOrEmpty(projectFileName)) { project.ToolsVersion = toolsVersion; return(engine.BuildProject(project, targetNames, targetOutputs, BuildSettings.DoNotResetPreviouslyBuiltTargets)); } else { BuildPropertyGroup bpg = new BuildPropertyGroup(); if (globalProperties != null) { foreach (DictionaryEntry de in globalProperties) { bpg.AddProperty(new BuildProperty( (string)de.Key, (string)de.Value, PropertyType.Global)); } } return(engine.BuildProjectFile(projectFileName, targetNames, bpg, targetOutputs, BuildSettings.DoNotResetPreviouslyBuiltTargets, toolsVersion)); } }
public bool BuildProjects(List<IProject> projects) { var engine = new Engine(); foreach (IProject project in projects) { string fullProjectPath = Path.Combine(project.ProjectPath, project.ProjectName); bool success = engine.BuildProjectFile(fullProjectPath); if (success == false) return false; } return true; }
public static bool BuildProject(string projectPath) { bool success = false; CultureInfo ci = CultureInfo.InvariantCulture; Engine engine = new Engine(); engine.BinPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) + @"\..\Microsoft.NET\Framework\v4.0.30319"; try { success = engine.BuildProjectFile(projectPath); } finally { engine.UnloadAllProjects(); } return success; }
public bool BuildProject(string projectPath) { bool success = false; CultureInfo ci = CultureInfo.InvariantCulture; Engine engine = new Engine(); engine.BinPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) + @"\..\Microsoft.NET\Framework\v4.0.30319"; try { success = engine.BuildProjectFile(projectPath); } catch(ArgumentException) { throw new System.IO.FileNotFoundException("The specified project to build not found!"); } finally { engine.UnloadAllProjects(); } return success; }
static void Main(string[] args) { // We need to tell MSBuild where msbuild.exe is, so it can launch child nodes string parameters = @"MSBUILDLOCATION=" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.System) + @"\..\Microsoft.NET\Framework\v3.5"; // We need to tell MSBuild whether nodes should hang around for 60 seconds after the build is done in case they are needed again bool nodeReuse = true; // e.g. if (!nodeReuse) { parameters += ";NODEREUSE=false"; } // We need to tell MSBuild the maximum number of nodes to use. It is usually fastest to pick about the same number as you have CPU cores int maxNodeCount = 3; // e.g. // Create the engine with this information Engine buildEngine = new Engine(null, ToolsetDefinitionLocations.Registry | ToolsetDefinitionLocations.ConfigurationFile, maxNodeCount, parameters); // Create a file logger with a matching forwarding logger, e.g. FileLogger fileLogger = new FileLogger(); fileLogger.Verbosity = LoggerVerbosity.Detailed; Assembly engineAssembly = Assembly.GetAssembly(typeof(Engine)); string loggerAssemblyName = engineAssembly.GetName().FullName; LoggerDescription fileLoggerForwardingLoggerDescription = new LoggerDescription("Microsoft.Build.BuildEngine.ConfigurableForwardingLogger", loggerAssemblyName, null, String.Empty, LoggerVerbosity.Detailed); // Create a regular console logger too, e.g. ConsoleLogger logger = new ConsoleLogger(); logger.Verbosity = LoggerVerbosity.Normal; // Register all of these loggers buildEngine.RegisterDistributedLogger(fileLogger, fileLoggerForwardingLoggerDescription); buildEngine.RegisterLogger(logger); // Do a build buildEngine.BuildProjectFile("root.proj"); // Finish cleanly buildEngine.Shutdown(); }
public void BuildProjectFilesInParallel2() { string[] fileNames = new string[10]; string[] fileNames2 = new string[10]; string[] fileNamesLeafs = new string[10]; string[] childTraversals = new string[10]; string parentTraversal = TraversalProjectFile("CTrav"); string traversalProject = TraversalProjectFile("ABC"); string[][] targetNamesPerProject = new string[fileNames.Length][]; IDictionary[] targetOutPutsPerProject = new IDictionary[fileNames.Length]; BuildPropertyGroup[] globalPropertiesPerProject = new BuildPropertyGroup[fileNames.Length]; string[] tempfilesToDelete = new string[fileNames.Length]; string[] tempfilesToDelete2 = new string[fileNames.Length]; string[] tempfilesToDelete3 = new string[fileNames.Length]; string[] tempfilesToDelete4 = new string[fileNames.Length]; Engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); try { for (int i = 0; i < fileNames.Length; i++) { string[] ProjectFiles1 = CreateGlobalPropertyProjectFileWithExtension("ABC"); string[] ProjectFiles2 = CreateGlobalPropertyProjectFileWithExtension("DEF"); string[] FileNamesLeafs = CreateGlobalPropertyProjectFileWithExtension("LEAF"); string[] ChildTraversals = CreateSingleProjectTraversalFileWithExtension(FileNamesLeafs[0],"CTrav"); fileNames[i] = ProjectFiles1[0]; fileNames2[i] = ProjectFiles2[0]; fileNamesLeafs[i] = FileNamesLeafs[0]; childTraversals[i] = ChildTraversals[0]; tempfilesToDelete[i] = ProjectFiles1[1]; tempfilesToDelete2[i] = ProjectFiles2[1]; tempfilesToDelete3[i] = FileNamesLeafs[1]; tempfilesToDelete4[i] = ChildTraversals[1]; targetNamesPerProject[i] = new string[] { "Build" }; } // Try building a traversal project that had other traversals engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFile(parentTraversal, new string[] { "Build" }, new BuildPropertyGroup(), null, BuildSettings.None, "3.5"); engine.Shutdown(); engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); // Try building the same traversal project on the same engine one after another engine.BuildProjectFile(traversalProject); engine.BuildProjectFile(traversalProject); engine.Shutdown(); // Try building the same set of project files on the same engine one after another engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.Shutdown(); // Try building a set of project files, then the same set as a traversal on the same engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFiles(fileNames2, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.BuildProjectFile(traversalProject); engine.Shutdown(); // Try building a traversal, then the same files which are in the traversal in parallel on the same engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFile(traversalProject); engine.BuildProjectFiles(fileNames2, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.Shutdown(); /* Do the same as above using single proc */ // Try building the same traversal project on the same engine one after another engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 1, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFile(traversalProject); engine.BuildProjectFile(traversalProject); engine.Shutdown(); // Try building the same set of project files on the same engine one after another engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 1, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.Shutdown(); // Try building a set of project files, then the same set as a traversal on the same engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 1, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFiles(fileNames2, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.BuildProjectFile(traversalProject); engine.Shutdown(); // Try building a traversal, then the same files which are in the traversal in parallel on the same engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFile(traversalProject); engine.BuildProjectFiles(fileNames2, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); } finally { engine.Shutdown(); for (int i = 0; i < fileNames.Length; i++) { File.Delete(fileNames[i]); File.Delete(fileNames2[i]); File.Delete(fileNamesLeafs[i]); File.Delete(childTraversals[i]); File.Delete(tempfilesToDelete[i]); File.Delete(tempfilesToDelete2[i]); File.Delete(tempfilesToDelete3[i]); File.Delete(tempfilesToDelete4[i]); } File.Delete(traversalProject); } }
public void BuildProjectFilesInParallel() { //Gets the currently loaded assembly in which the specified class is defined Assembly engineAssembly = Assembly.GetAssembly(typeof(Engine)); string loggerClassName = "Microsoft.Build.BuildEngine.ConfigurableForwardingLogger"; string loggerAssemblyName = engineAssembly.GetName().FullName; LoggerDescription forwardingLoggerDescription = new LoggerDescription(loggerClassName, loggerAssemblyName, null, null, LoggerVerbosity.Normal); string[] fileNames = new string[10]; string traversalProject = TraversalProjectFile("ABC"); string[][] targetNamesPerProject = new string[fileNames.Length][]; IDictionary[] targetOutPutsPerProject = new IDictionary[fileNames.Length]; BuildPropertyGroup[] globalPropertiesPerProject = new BuildPropertyGroup[fileNames.Length]; string[] tempfilesToDelete = new string[fileNames.Length]; Engine engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); try { for (int i = 0; i < fileNames.Length; i++) { string[] ProjectFiles1 = CreateGlobalPropertyProjectFileWithExtension("ABC"); fileNames[i] = ProjectFiles1[0]; tempfilesToDelete[i] = ProjectFiles1[1]; targetNamesPerProject[i] = new string[] { "Build" }; } // Test building a traversal engine.BuildProjectFile(traversalProject); engine.Shutdown(); // Test building the same set of files in parallel Console.Out.WriteLine("1:"+Process.GetCurrentProcess().MainModule.FileName); Console.Out.WriteLine("2:" + AppDomain.CurrentDomain.BaseDirectory); engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterDistributedLogger(new ConsoleLogger(LoggerVerbosity.Normal), forwardingLoggerDescription); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); engine.Shutdown(); // Do the same using singleproc engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 4, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFile(traversalProject); engine.Shutdown(); engine = new Engine(null, ToolsetDefinitionLocations.ConfigurationFile | ToolsetDefinitionLocations.Registry, 1, "msbuildlocation="+ AppDomain.CurrentDomain.BaseDirectory); engine.RegisterLogger(new ConsoleLogger(LoggerVerbosity.Normal)); engine.BuildProjectFiles(fileNames, targetNamesPerProject, globalPropertiesPerProject, targetOutPutsPerProject, BuildSettings.None, new string[fileNames.Length]); } finally { engine.Shutdown(); for (int i = 0; i < fileNames.Length; i++) { File.Delete(fileNames[i]); File.Delete(tempfilesToDelete[i]); } File.Delete(traversalProject); } }
public override void Execute() { if (!(hostContext.Data["EnabledRenderers"] as StringCollection).Contains(this.Identifier)) return; // Get parameters Dictionary<String, StringCollection> parameters = hostContext.Data["CommandParameters"] as Dictionary<String, StringCollection>; System.Diagnostics.Trace.WriteLine("\r\nStarting RIMBA Renderer", "information"); StringCollection genFormatters = new StringCollection(); bool makeWP7Proj = false; if (hostContext.Mode == Pipeline.OperationModeType.Quirks) System.Diagnostics.Trace.WriteLine("--- WARNING ---\r\n Host context is operating in Quirks mode, GPMR cannot guarantee output will be accurate\r\n--- WARNING ---"); #region Validate all parameters // Validate parameters if (!parameters.ContainsKey("rimbapi-api-ns")) { parameters.Add("rimbapi-api-ns", new StringCollection()); parameters["rimbapi-api-ns"].Add("MARC.Everest"); } if (!parameters.ContainsKey("rimbapi-target-ns")) { parameters.Add("rimbapi-target-ns", new StringCollection()); parameters["rimbapi-target-ns"].Add("output"); } if (parameters.ContainsKey("rimbapi-root-class")) RootClass = parameters["rimbapi-root-class"][0]; if (parameters.ContainsKey("rimbapi-gen-vocab")) GenerateVocab = Convert.ToBoolean(parameters["rimbapi-gen-vocab"][0]); if(parameters.ContainsKey("rimbapi-gen-rim")) GenerateRim = Convert.ToBoolean(parameters["rimbapi-gen-rim"][0]); if (parameters.ContainsKey("rimbapi-profileid")) InteractionRenderer.profileId = parameters["rimbapi-profileid"][0]; if (parameters.ContainsKey("rimbapi-oid-profileid")) InteractionRenderer.profileIdOid = parameters["rimbapi-oid-profileid"][0]; if (parameters.ContainsKey("rimbapi-oid-interactionid")) InteractionRenderer.interactionIdOid = parameters["rimbapi-oid-interactionid"][0]; if (parameters.ContainsKey("rimbapi-oid-triggerevent")) InteractionRenderer.triggerEventOid = parameters["rimbapi-oid-triggerevent"][0]; if (parameters.ContainsKey("rimbapi-gen-its")) genFormatters = parameters["rimbapi-gen-its"]; if (parameters.ContainsKey("rimbapi-phone")) makeWP7Proj = bool.Parse(parameters["rimbapi-phone"][0]); #endregion // Initialize Heuristics MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.HeuristicEngine.Datatypes.Initialize(parameters["rimbapi-api-ns"][0]); MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.HeuristicEngine.Interfaces.Initialize(parameters["rimbapi-api-ns"][0]); // Get our repository ready ClassRepository classRep = hostContext.Data["SourceCR"] as ClassRepository; string ProjectFileName = "output.csproj"; // Set the output file name if (parameters.ContainsKey("rimbapi-target-ns")) ProjectFileName = parameters["rimbapi-target-ns"][0]; if(parameters.ContainsKey("rimbapi-partials")) RenderPartials = Boolean.Parse(parameters["rimbapi-partials"][0]); if (parameters.ContainsKey("rimbapi-realm-pref")) prefRealm = parameters["rimbapi-realm-pref"][0]; if (parameters.ContainsKey("rimbapi-max-literals")) MaxLiterals = Int32.Parse(parameters["rimbapi-max-literals"][0]); if (parameters.ContainsKey("rimbapi-suppress-doc")) SuppressDoc = Boolean.Parse(parameters["rimbapi-suppress-doc"][0]); // Setup the template parameters string[][] templateFields = new string[][] { new string[] { "$license$", parameters.ContainsKey("rimbapi-license") ? Licenses.ResourceManager.GetString(parameters["rimbapi-license"][0].ToUpper()) : "" }, new string[] { "$org$", parameters.ContainsKey("rimbapi-org") ? parameters["rimbapi-org"][0] : "" }, new string[] { "$date$", DateTime.Now.ToString("yyyy-MM-dd") }, new string[] { "$clrversion$", Environment.Version.ToString() }, new string[] { "$time$", DateTime.Now.ToString("HH:mm:ss") }, new string[] { "$author$", SystemInformation.UserName }, new string[] { "$year$", DateTime.Now.Year.ToString() }, new string[] { "$version$", Assembly.GetEntryAssembly().GetName().Version.ToString() }, new string[] { "$guid$", Guid.NewGuid().ToString() }, new string[] { "$name$", ProjectFileName }, new string[] { "$mrversion$", InteractionRenderer.profileId ?? "" } }; // Now we want to scan our assembly for FeatureRenderers List<KeyValuePair<FeatureRendererAttribute, IFeatureRenderer>> renderers = new List<KeyValuePair<FeatureRendererAttribute, IFeatureRenderer>>(); foreach(Type t in this.GetType().Assembly.GetTypes()) if (t.GetInterface("MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.Interfaces.IFeatureRenderer") != null && t.GetCustomAttributes(typeof(FeatureRendererAttribute), true).Length > 0) { foreach(FeatureRendererAttribute feature in (t.GetCustomAttributes(typeof(FeatureRendererAttribute), true))) { // Only one feature renderer per feature, so if the dictionary throws an exception // on the add it is ok renderers.Add(new KeyValuePair<FeatureRendererAttribute,IFeatureRenderer>(feature, (IFeatureRenderer)t.Assembly.CreateInstance(t.FullName))); } } #region Setup the project // Create engine reference Microsoft.Build.BuildEngine.Engine engine = new Microsoft.Build.BuildEngine.Engine( Path.Combine(Path.Combine(Path.Combine(System.Environment.SystemDirectory, "..\\Microsoft.NET"), "Framework"), "v3.5")), phoneEngine = new Microsoft.Build.BuildEngine.Engine( Path.Combine(Path.Combine(Path.Combine(System.Environment.SystemDirectory, "..\\Microsoft.NET"), "Framework"), "v4.0.30319")); // Create MSPROJ Microsoft.Build.BuildEngine.Project project = new Microsoft.Build.BuildEngine.Project(engine), phoneProj = new Project(phoneEngine, "4.0"); phoneProj.DefaultTargets = project.DefaultTargets = "Build"; // Setup project attributes Microsoft.Build.BuildEngine.BuildPropertyGroup pg = project.AddNewPropertyGroup(false); Microsoft.Build.BuildEngine.BuildProperty property = pg.AddNewProperty("Configuration", "Release"); property.Condition = "'$(Configuration)' == ''"; property = pg.AddNewProperty("Platform", "AnyCPU"); property.Condition = "'$(Platform)' == ''"; pg.AddNewProperty("ProductVersion", "10.0.20506"); pg.AddNewProperty("SchemaVersion", "2.0"); pg.AddNewProperty("ProjectGuid", Guid.NewGuid().ToString()); pg.AddNewProperty("OutputType", "Library"); pg.AddNewProperty("AppDesignerFolder", "Properties"); pg.AddNewProperty("RootNamespace", parameters["rimbapi-target-ns"][0]); pg.AddNewProperty("AssemblyName", parameters["rimbapi-target-ns"][0]); // Release AnyCPU pg = project.AddNewPropertyGroup(false); pg.Condition = "'$(Configuration)|$(Platform)' == 'Release|AnyCPU'"; pg.AddNewProperty("DebugType", "pdbonly"); pg.AddNewProperty("Optimize", "true"); pg.AddNewProperty("OutputPath", "bin\\release"); pg.AddNewProperty("DefineConstants", "TRACE"); pg.AddNewProperty("ErrorReport", "prompt"); pg.AddNewProperty("WarningLevel", "4"); pg.AddNewProperty("DocumentationFile", "bin\\release\\" + parameters["rimbapi-target-ns"][0] + ".xml"); // Create Dir Structure Directory.CreateDirectory(Path.Combine(hostContext.Output, "bin")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "lib")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Properties")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Vocabulary")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Interaction")); // Add reference structure Microsoft.Build.BuildEngine.BuildItemGroup refItemGroup = project.AddNewItemGroup(); // Add References File.Copy(Path.Combine(System.Windows.Forms.Application.StartupPath, "MARC.Everest.dll"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.dll"), true); if(makeWP7Proj) File.Copy(Path.Combine(Path.Combine(System.Windows.Forms.Application.StartupPath, "lib"), "MARC.Everest.Phone.dll"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.Phone.dll"), true); File.Copy(Path.Combine(System.Windows.Forms.Application.StartupPath, "MARC.Everest.xml"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.xml"), true); refItemGroup.AddNewItem("Reference", "System"); refItemGroup.AddNewItem("Reference", "System.Drawing"); refItemGroup.AddNewItem("Reference", "System.Xml"); Microsoft.Build.BuildEngine.BuildItem buildItem = refItemGroup.AddNewItem("Reference", @"MARC.Everest"); buildItem.SetMetadata("SpecificVersion", "false"); buildItem.SetMetadata("HintPath", "lib\\MARC.Everest.dll"); project.AddNewImport("$(MSBuildBinPath)\\Microsoft.CSharp.targets", null); Microsoft.Build.BuildEngine.BuildItemGroup fileItemGroup = project.AddNewItemGroup(), phoneFileItemGroup = phoneProj.AddNewItemGroup(); #region Assembly Info try { TextWriter tw = File.CreateText(Path.Combine(Path.Combine(hostContext.Output, "Properties"), "AssemblyInfo.cs")); try { string Header = Template.AssemblyInfo; // Set the header to the default // Populate template fields foreach (String[] st in templateFields) Header = Header.Replace(st[0], st[1]); // Write header tw.Write(Header); } finally { tw.Close(); } fileItemGroup.AddNewItem("Compile", Path.Combine("Properties", "AssemblyInfo.cs")); phoneFileItemGroup.AddNewItem("Compile", Path.Combine("Properties", "AssemblyInfo.cs")); } catch(Exception) { System.Diagnostics.Trace.WriteLine("Couldn't generate the AssemblyInfo.cs file for this project", "warn"); } #endregion #endregion #region Code Create // Convert class rep to list List<Feature> features = new List<Feature>(); foreach (KeyValuePair<String, Feature> kv in classRep) features.Add(kv.Value); // Sort so classes are processed first features.Sort(delegate(Feature a, Feature b) { if ((a is SubSystem) && !(b is SubSystem)) return -1; else if ((b is SubSystem) && !(a is SubSystem)) return 1; else return a.GetType().Name.CompareTo(b.GetType().Name); }); RenderFeatureList(features, templateFields, renderers, fileItemGroup, phoneFileItemGroup, parameters); // Any added features? // HACK: This should be fixed soon, but meh... I'll get around to it List<Feature> addlFeatures = new List<Feature>(); foreach (KeyValuePair<String, Feature> kv in classRep) if(!features.Contains(kv.Value)) addlFeatures.Add(kv.Value); RenderFeatureList(addlFeatures, templateFields, renderers, fileItemGroup, phoneFileItemGroup, parameters); // Save the project project.Save(Path.Combine(hostContext.Output, ProjectFileName) + ".csproj"); #endregion // Compile? #region Compile this project // Does the user want to compile? if (parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { string logPath = Path.Combine(Path.GetTempPath(), Path.GetTempFileName()); // Create log Microsoft.Build.BuildEngine.FileLogger logger = new Microsoft.Build.BuildEngine.FileLogger(); logger.Parameters = "logfile=" + logPath; engine.RegisterLogger(logger); System.Diagnostics.Trace.Write(String.Format("Compiling project (Build log {0})...", logPath), "information"); // Compile if (engine.BuildProject(project)) System.Diagnostics.Trace.WriteLine("Success!", "information"); else { System.Diagnostics.Trace.WriteLine("Fail", "information"); throw new InvalidOperationException("Failed compilation, operation cannot continue"); } engine.UnregisterAllLoggers(); } #endregion #region Windows Phone if (makeWP7Proj) { // Setup project attributes pg = phoneProj.AddNewPropertyGroup(false); property = pg.AddNewProperty("Configuration", "Release"); property.Condition = "'$(Configuration)' == ''"; property = pg.AddNewProperty("Platform", "AnyCPU"); property.Condition = "'$(Platform)' == ''"; pg.AddNewProperty("ProductVersion", "10.0.20506"); pg.AddNewProperty("SchemaVersion", "2.0"); pg.AddNewProperty("ProjectGuid", Guid.NewGuid().ToString()); pg.AddNewProperty("OutputType", "Library"); pg.AddNewProperty("AppDesignerFolder", "Properties"); pg.AddNewProperty("RootNamespace", parameters["rimbapi-target-ns"][0]); pg.AddNewProperty("AssemblyName", parameters["rimbapi-target-ns"][0] + ".Phone"); pg.AddNewProperty("ProjectTypeGuids", "{C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); pg.AddNewProperty("TargetFrameworkVersion", "v4.0"); pg.AddNewProperty("SilverlightVersion", "$(TargetFrameworkVersion)"); pg.AddNewProperty("TargetFrameworkProfile", "WindowsPhone71"); pg.AddNewProperty("TargetFrameworkIdentifier", "Silverlight"); pg.AddNewProperty("SilverlightApplication", "false"); pg.AddNewProperty("ValidateXaml", "true"); pg.AddNewProperty("ThrowErrorsInValidation", "true"); // Release AnyCPU pg = phoneProj.AddNewPropertyGroup(false); pg.Condition = "'$(Configuration)|$(Platform)' == 'Release|AnyCPU'"; pg.AddNewProperty("DebugType", "pdbonly"); pg.AddNewProperty("Optimize", "true"); pg.AddNewProperty("OutputPath", "bin\\release"); pg.AddNewProperty("DefineConstants", "TRACE;SILVERLIGHT;WINDOWS_PHONE"); pg.AddNewProperty("ErrorReport", "prompt"); pg.AddNewProperty("NoStdLib", "true"); pg.AddNewProperty("NoConfig", "true"); pg.AddNewProperty("WarningLevel", "4"); pg.AddNewProperty("DocumentationFile", "bin\\release\\" + parameters["rimbapi-target-ns"][0] + ".Phone.xml"); // Add reference structure refItemGroup = phoneProj.AddNewItemGroup(); refItemGroup.AddNewItem("Reference", "System"); refItemGroup.AddNewItem("Reference", "System.Xml"); BuildItem evReference = refItemGroup.AddNewItem("Reference", @"MARC.Everest.Phone"); evReference.SetMetadata("SpecificVersion", "false"); evReference.SetMetadata("HintPath", "lib\\MARC.Everest.Phone.dll"); // Add WP7 Imports phoneProj.AddNewImport(@"$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.$(TargetFrameworkProfile).Overrides.targets", null); phoneProj.AddNewImport(@"$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.CSharp.targets", null); // HACK: Add tools version string fileName = Path.Combine(hostContext.Output, ProjectFileName) + ".Phone.csproj"; phoneProj.Save(fileName); XmlDocument doc = new XmlDocument(); doc.Load(fileName); doc.DocumentElement.Attributes.Append(doc.CreateAttribute("ToolsVersion")); doc.DocumentElement.Attributes["ToolsVersion"].Value = "4.0"; doc.Save(fileName); if (parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { System.Diagnostics.Trace.Write(String.Format("Compiling phone project..."), "information"); // Compile if (phoneEngine.BuildProjectFile(fileName)) System.Diagnostics.Trace.WriteLine("Success!", "information"); else { System.Diagnostics.Trace.WriteLine("Fail", "information"); throw new InvalidOperationException("Failed compilation, operation cannot continue"); } } } #endregion #region Generate Formatter Assemblies // Generate the formatter assemblies if (genFormatters.Count > 0 && parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); Trace.WriteLine("Generating ITS Formatter Types:", "information"); // Load the assembly Assembly genAsm = Assembly.LoadFile(Path.Combine(Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"), ProjectFileName + ".dll")); foreach (string s in genFormatters) GenerateFormatterAssembly(s, genAsm, InteractionRenderer.profileId ?? "formatter"); // Assembly resolve AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve); } else if (genFormatters.Count > 0) Trace.WriteLine("Can't use --rimbapi-gen-its when --rimbapi-compile is not true, skipping ITS generation", "warn"); #endregion // Does the user only want asm? #region dllonly if (parameters.ContainsKey("rimbapi-dllonly") && parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-dllonly"][0])) try { // Move the assemblies up to root foreach (string file in Directory.GetFiles(Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"))) { if (File.Exists(Path.Combine(hostContext.Output, Path.GetFileName(file)))) File.Delete(Path.Combine(hostContext.Output, Path.GetFileName(file))); File.Move(file, Path.Combine(hostContext.Output, Path.GetFileName(file))); } // Clean all in the projects and remove all directories List<String> directories = new List<string>(new string[] { Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"), Path.Combine(hostContext.Output, "bin"), Path.Combine(hostContext.Output, "lib"), Path.Combine(hostContext.Output, "Vocabulary"), Path.Combine(hostContext.Output, "Interaction"), Path.Combine(hostContext.Output, "obj") }); // Gather files and clean foreach (Microsoft.Build.BuildEngine.BuildItem fi in fileItemGroup) { // Add directory on the "to be deleted" string dirName = Path.GetDirectoryName(Path.Combine(hostContext.Output, fi.Include)); if (!directories.Contains(dirName)) directories.Add(dirName); Trace.WriteLine(String.Format("Deleting {0}...", fi.Include), "debug"); File.Delete(Path.Combine(hostContext.Output, fi.Include)); } // Clean dirs foreach (string s in directories) Directory.Delete(s, true); File.Delete(project.FullFileName); } catch(Exception) { System.Diagnostics.Trace.WriteLine("Could not clean working files!", "warn"); } #endregion }
public void Execute () { bool result = false; bool show_stacktrace = false; try { parameters.ParseArguments (args); show_stacktrace = (parameters.LoggerVerbosity == LoggerVerbosity.Detailed || parameters.LoggerVerbosity == LoggerVerbosity.Diagnostic); if (!parameters.NoLogo) ErrorUtilities.ShowVersion (false); engine = Engine.GlobalEngine; if (!String.IsNullOrEmpty (parameters.ToolsVersion)) { if (engine.Toolsets [parameters.ToolsVersion] == null) ErrorUtilities.ReportError (0, new UnknownToolsVersionException (parameters.ToolsVersion).Message); engine.DefaultToolsVersion = parameters.ToolsVersion; } engine.GlobalProperties = this.parameters.Properties; if (!parameters.NoConsoleLogger) { printer = new ConsoleReportPrinter (); ConsoleLogger cl = new ConsoleLogger (parameters.LoggerVerbosity, printer.Print, printer.SetForeground, printer.ResetColor); cl.Parameters = parameters.ConsoleLoggerParameters; cl.Verbosity = parameters.LoggerVerbosity; engine.RegisterLogger (cl); } if (parameters.FileLoggerParameters != null) { for (int i = 0; i < parameters.FileLoggerParameters.Length; i ++) { string fl_params = parameters.FileLoggerParameters [i]; if (fl_params == null) continue; var fl = new FileLogger (); if (fl_params.Length == 0 && i > 0) fl.Parameters = String.Format ("LogFile=msbuild{0}.log", i); else fl.Parameters = fl_params; engine.RegisterLogger (fl); } } foreach (LoggerInfo li in parameters.Loggers) { Assembly assembly; if (li.InfoType == LoadInfoType.AssemblyFilename) assembly = Assembly.LoadFrom (li.Filename); else assembly = Assembly.Load (li.AssemblyName); ILogger logger = (ILogger)Activator.CreateInstance (assembly.GetType (li.ClassName)); logger.Parameters = li.Parameters; engine.RegisterLogger (logger); } project = engine.CreateNewProject (); if (parameters.Validate) { if (parameters.ValidationSchema == null) project.SchemaFile = defaultSchema; else project.SchemaFile = parameters.ValidationSchema; } string projectFile = parameters.ProjectFile; if (!File.Exists (projectFile)) { ErrorUtilities.ReportError (0, String.Format ("Project file '{0}' not found.", projectFile)); return; } result = engine.BuildProjectFile (projectFile, parameters.Targets, null, null, BuildSettings.None, parameters.ToolsVersion); } catch (InvalidProjectFileException ipfe) { ErrorUtilities.ReportError (0, show_stacktrace ? ipfe.ToString () : ipfe.Message); } catch (InternalLoggerException ile) { ErrorUtilities.ReportError (0, show_stacktrace ? ile.ToString () : ile.Message); } catch (CommandLineException cle) { ErrorUtilities.ReportError(cle.ErrorCode, show_stacktrace ? cle.ToString() : cle.Message); } finally { if (engine != null) engine.UnregisterAllLoggers (); Environment.Exit (result ? 0 : 1); } }
public void BuildProjectFileEmptyString() { Engine e = new Engine(); e.BuildProjectFile(String.Empty); }
public static bool Build(Project pProj, OutputWindowPane pPane, string pTarget, NameValueCollection pParams) { Microsoft.Build.BuildEngine.Engine buildEngine = new Microsoft.Build.BuildEngine.Engine(); BuildExecutor executor = new BuildExecutor(pPane); RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\.NETFramework", false); if (key == null) { throw new Exception("Failed to determine .NET Framework install root - no .NETFramework key"); } string installRoot = key.GetValue("InstallRoot") as string; if (installRoot == null) { throw new Exception("Failed to determine .NET Framework install root - no InstallRoot value"); } key.Close(); buildEngine.BinPath = Path.Combine(installRoot, string.Format("v{0}.{1}.{2}", Environment.Version.Major, Environment.Version.Minor, Environment.Version.Build)); buildEngine.RegisterLogger(executor); executor.Verbosity = LoggerVerbosity.Normal; BuildPropertyGroup properties = new BuildPropertyGroup(); foreach (string propKey in pParams.Keys) { string val = pParams[propKey]; properties.SetProperty(propKey, val, true); } return buildEngine.BuildProjectFile(pProj.FileName, new string[]{pTarget}, properties); }
/// <summary> /// MSDeploy web role project file. /// </summary> /// <param name="csprojPath">Full path to web role .csproj file</param> /// <param name="msDeployDir">Temporary packageTmp folder</param> /// <returns>MsDeploy success status</returns> public static bool MsDeploy(string csprojPath, string msDeployDir) { Console.WriteLine(" Verifying csproj path..."); try { var csprojFileInfo = new FileInfo(csprojPath); if (!csprojFileInfo.Exists || !csprojFileInfo.Name.EndsWith(".csproj")) { Console.WriteLine(" csproj file could not be found at: " + csprojPath); return false; } Console.WriteLine(" csproj found."); Console.WriteLine(" Building project..."); var engine = new Engine(); var csprojParentDir = csprojFileInfo.Directory; var logger = new FileLogger { Parameters = "logfile=" + csprojParentDir + @"\publish.log" }; engine.RegisterLogger(logger); var buildPropGroup = new BuildPropertyGroup(); buildPropGroup.SetProperty("OutDir", msDeployDir); var deployOnBuildSuccess = engine.BuildProjectFile(csprojPath, new[] { "Rebuild" }, buildPropGroup); if (deployOnBuildSuccess) Console.WriteLine(" Successfully MsDeploy project."); else Console.WriteLine(" Build failed. Check " + csprojParentDir + @"\publish.log for details."); engine.UnloadAllProjects(); engine.UnregisterAllLoggers(); return deployOnBuildSuccess; } catch (Exception ex) { Console.WriteLine(" " + ex.GetType() + ": " + ex.Message); return false; } }
public void TestLoadProjectDifferentGP() { MockLogger logger = new MockLogger(); string path = ObjectModelHelpers.CreateTempFileOnDisk(@" <Project DefaultTargets=`Build` ToolsVersion=`msbuilddefaulttoolsversion` xmlns=`msbuildnamespace`> <Target Name=`Build`> <Warning Text=`This is a scary warning message.` Code=`MSB9999` HelpKeyword=`MSBuild.keyword`/> <Error Text=`A horrible error has occurred. Be very afraid.` Code=`MSB1111` HelpKeyword=`MSBuild.otherkeyword`/> </Target> </Project> "); Engine engine = new Engine(); Project project = engine.CreateNewProject(); project.Load(path); project.GlobalProperties.SetProperty("a", "b"); engine.BuildProjectFile(path); }
public override void Execute() { if (!(hostContext.Data["EnabledRenderers"] as StringCollection).Contains(this.Identifier)) { return; } // Get parameters Dictionary <String, StringCollection> parameters = hostContext.Data["CommandParameters"] as Dictionary <String, StringCollection>; System.Diagnostics.Trace.WriteLine("\r\nStarting RIMBA Renderer", "information"); StringCollection genFormatters = new StringCollection(); bool makeWP7Proj = false; if (hostContext.Mode == Pipeline.OperationModeType.Quirks) { System.Diagnostics.Trace.WriteLine("--- WARNING ---\r\n Host context is operating in Quirks mode, GPMR cannot guarantee output will be accurate\r\n--- WARNING ---"); } #region Validate all parameters // Validate parameters if (!parameters.ContainsKey("rimbapi-api-ns")) { parameters.Add("rimbapi-api-ns", new StringCollection()); parameters["rimbapi-api-ns"].Add("MARC.Everest"); } if (!parameters.ContainsKey("rimbapi-target-ns")) { parameters.Add("rimbapi-target-ns", new StringCollection()); parameters["rimbapi-target-ns"].Add("output"); } if (parameters.ContainsKey("rimbapi-root-class")) { RootClass = parameters["rimbapi-root-class"][0]; } if (parameters.ContainsKey("rimbapi-gen-vocab")) { GenerateVocab = Convert.ToBoolean(parameters["rimbapi-gen-vocab"][0]); } if (parameters.ContainsKey("rimbapi-gen-rim")) { GenerateRim = Convert.ToBoolean(parameters["rimbapi-gen-rim"][0]); } if (parameters.ContainsKey("rimbapi-profileid")) { InteractionRenderer.profileId = parameters["rimbapi-profileid"][0]; } if (parameters.ContainsKey("rimbapi-oid-profileid")) { InteractionRenderer.profileIdOid = parameters["rimbapi-oid-profileid"][0]; } if (parameters.ContainsKey("rimbapi-oid-interactionid")) { InteractionRenderer.interactionIdOid = parameters["rimbapi-oid-interactionid"][0]; } if (parameters.ContainsKey("rimbapi-oid-triggerevent")) { InteractionRenderer.triggerEventOid = parameters["rimbapi-oid-triggerevent"][0]; } if (parameters.ContainsKey("rimbapi-gen-its")) { genFormatters = parameters["rimbapi-gen-its"]; } if (parameters.ContainsKey("rimbapi-phone")) { makeWP7Proj = bool.Parse(parameters["rimbapi-phone"][0]); } #endregion // Initialize Heuristics MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.HeuristicEngine.Datatypes.Initialize(parameters["rimbapi-api-ns"][0]); MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.HeuristicEngine.Interfaces.Initialize(parameters["rimbapi-api-ns"][0]); // Get our repository ready ClassRepository classRep = hostContext.Data["SourceCR"] as ClassRepository; string ProjectFileName = "output.csproj"; // Set the output file name if (parameters.ContainsKey("rimbapi-target-ns")) { ProjectFileName = parameters["rimbapi-target-ns"][0]; } if (parameters.ContainsKey("rimbapi-partials")) { RenderPartials = Boolean.Parse(parameters["rimbapi-partials"][0]); } if (parameters.ContainsKey("rimbapi-realm-pref")) { prefRealm = parameters["rimbapi-realm-pref"][0]; } if (parameters.ContainsKey("rimbapi-max-literals")) { MaxLiterals = Int32.Parse(parameters["rimbapi-max-literals"][0]); } if (parameters.ContainsKey("rimbapi-suppress-doc")) { SuppressDoc = Boolean.Parse(parameters["rimbapi-suppress-doc"][0]); } // Setup the template parameters string[][] templateFields = new string[][] { new string[] { "$license$", parameters.ContainsKey("rimbapi-license") ? Licenses.ResourceManager.GetString(parameters["rimbapi-license"][0].ToUpper()) : "" }, new string[] { "$org$", parameters.ContainsKey("rimbapi-org") ? parameters["rimbapi-org"][0] : "" }, new string[] { "$date$", DateTime.Now.ToString("yyyy-MM-dd") }, new string[] { "$clrversion$", Environment.Version.ToString() }, new string[] { "$time$", DateTime.Now.ToString("HH:mm:ss") }, new string[] { "$author$", SystemInformation.UserName }, new string[] { "$year$", DateTime.Now.Year.ToString() }, new string[] { "$version$", Assembly.GetEntryAssembly().GetName().Version.ToString() }, new string[] { "$guid$", Guid.NewGuid().ToString() }, new string[] { "$name$", ProjectFileName }, new string[] { "$mrversion$", InteractionRenderer.profileId ?? "" } }; // Now we want to scan our assembly for FeatureRenderers List <KeyValuePair <FeatureRendererAttribute, IFeatureRenderer> > renderers = new List <KeyValuePair <FeatureRendererAttribute, IFeatureRenderer> >(); foreach (Type t in this.GetType().Assembly.GetTypes()) { if (t.GetInterface("MohawkCollege.EHR.gpmr.Pipeline.Renderer.RimbaCS.Interfaces.IFeatureRenderer") != null && t.GetCustomAttributes(typeof(FeatureRendererAttribute), true).Length > 0) { foreach (FeatureRendererAttribute feature in (t.GetCustomAttributes(typeof(FeatureRendererAttribute), true))) { // Only one feature renderer per feature, so if the dictionary throws an exception // on the add it is ok renderers.Add(new KeyValuePair <FeatureRendererAttribute, IFeatureRenderer>(feature, (IFeatureRenderer)t.Assembly.CreateInstance(t.FullName))); } } } #region Setup the project // Create engine reference Microsoft.Build.BuildEngine.Engine engine = new Microsoft.Build.BuildEngine.Engine( Path.Combine(Path.Combine(Path.Combine(System.Environment.SystemDirectory, "..\\Microsoft.NET"), "Framework"), "v3.5")), phoneEngine = new Microsoft.Build.BuildEngine.Engine( Path.Combine(Path.Combine(Path.Combine(System.Environment.SystemDirectory, "..\\Microsoft.NET"), "Framework"), "v4.0.30319")); // Create MSPROJ Microsoft.Build.BuildEngine.Project project = new Microsoft.Build.BuildEngine.Project(engine), phoneProj = new Project(phoneEngine, "4.0"); phoneProj.DefaultTargets = project.DefaultTargets = "Build"; // Setup project attributes Microsoft.Build.BuildEngine.BuildPropertyGroup pg = project.AddNewPropertyGroup(false); Microsoft.Build.BuildEngine.BuildProperty property = pg.AddNewProperty("Configuration", "Release"); property.Condition = "'$(Configuration)' == ''"; property = pg.AddNewProperty("Platform", "AnyCPU"); property.Condition = "'$(Platform)' == ''"; pg.AddNewProperty("ProductVersion", "10.0.20506"); pg.AddNewProperty("SchemaVersion", "2.0"); pg.AddNewProperty("ProjectGuid", Guid.NewGuid().ToString()); pg.AddNewProperty("OutputType", "Library"); pg.AddNewProperty("AppDesignerFolder", "Properties"); pg.AddNewProperty("RootNamespace", parameters["rimbapi-target-ns"][0]); pg.AddNewProperty("AssemblyName", parameters["rimbapi-target-ns"][0]); // Release AnyCPU pg = project.AddNewPropertyGroup(false); pg.Condition = "'$(Configuration)|$(Platform)' == 'Release|AnyCPU'"; pg.AddNewProperty("DebugType", "pdbonly"); pg.AddNewProperty("Optimize", "true"); pg.AddNewProperty("OutputPath", "bin\\release"); pg.AddNewProperty("DefineConstants", "TRACE"); pg.AddNewProperty("ErrorReport", "prompt"); pg.AddNewProperty("WarningLevel", "4"); pg.AddNewProperty("DocumentationFile", "bin\\release\\" + parameters["rimbapi-target-ns"][0] + ".xml"); // Create Dir Structure Directory.CreateDirectory(Path.Combine(hostContext.Output, "bin")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "lib")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Properties")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Vocabulary")); Directory.CreateDirectory(Path.Combine(hostContext.Output, "Interaction")); // Add reference structure Microsoft.Build.BuildEngine.BuildItemGroup refItemGroup = project.AddNewItemGroup(); // Add References File.Copy(Path.Combine(System.Windows.Forms.Application.StartupPath, "MARC.Everest.dll"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.dll"), true); if (makeWP7Proj) { File.Copy(Path.Combine(Path.Combine(System.Windows.Forms.Application.StartupPath, "lib"), "MARC.Everest.Phone.dll"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.Phone.dll"), true); } File.Copy(Path.Combine(System.Windows.Forms.Application.StartupPath, "MARC.Everest.xml"), Path.Combine(Path.Combine(hostContext.Output, "lib"), "MARC.Everest.xml"), true); refItemGroup.AddNewItem("Reference", "System"); refItemGroup.AddNewItem("Reference", "System.Drawing"); refItemGroup.AddNewItem("Reference", "System.Xml"); Microsoft.Build.BuildEngine.BuildItem buildItem = refItemGroup.AddNewItem("Reference", @"MARC.Everest"); buildItem.SetMetadata("SpecificVersion", "false"); buildItem.SetMetadata("HintPath", "lib\\MARC.Everest.dll"); project.AddNewImport("$(MSBuildBinPath)\\Microsoft.CSharp.targets", null); Microsoft.Build.BuildEngine.BuildItemGroup fileItemGroup = project.AddNewItemGroup(), phoneFileItemGroup = phoneProj.AddNewItemGroup(); #region Assembly Info try { TextWriter tw = File.CreateText(Path.Combine(Path.Combine(hostContext.Output, "Properties"), "AssemblyInfo.cs")); try { string Header = Template.AssemblyInfo; // Set the header to the default // Populate template fields foreach (String[] st in templateFields) { Header = Header.Replace(st[0], st[1]); } // Write header tw.Write(Header); } finally { tw.Close(); } fileItemGroup.AddNewItem("Compile", Path.Combine("Properties", "AssemblyInfo.cs")); phoneFileItemGroup.AddNewItem("Compile", Path.Combine("Properties", "AssemblyInfo.cs")); } catch (Exception) { System.Diagnostics.Trace.WriteLine("Couldn't generate the AssemblyInfo.cs file for this project", "warn"); } #endregion #endregion #region Code Create // Convert class rep to list List <Feature> features = new List <Feature>(); foreach (KeyValuePair <String, Feature> kv in classRep) { features.Add(kv.Value); } // Sort so classes are processed first features.Sort(delegate(Feature a, Feature b) { if ((a is SubSystem) && !(b is SubSystem)) { return(-1); } else if ((b is SubSystem) && !(a is SubSystem)) { return(1); } else { return(a.GetType().Name.CompareTo(b.GetType().Name)); } }); RenderFeatureList(features, templateFields, renderers, fileItemGroup, phoneFileItemGroup, parameters); // Any added features? // HACK: This should be fixed soon, but meh... I'll get around to it List <Feature> addlFeatures = new List <Feature>(); foreach (KeyValuePair <String, Feature> kv in classRep) { if (!features.Contains(kv.Value)) { addlFeatures.Add(kv.Value); } } RenderFeatureList(addlFeatures, templateFields, renderers, fileItemGroup, phoneFileItemGroup, parameters); // Save the project project.Save(Path.Combine(hostContext.Output, ProjectFileName) + ".csproj"); #endregion // Compile? #region Compile this project // Does the user want to compile? if (parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { string logPath = Path.Combine(Path.GetTempPath(), Path.GetTempFileName()); // Create log Microsoft.Build.BuildEngine.FileLogger logger = new Microsoft.Build.BuildEngine.FileLogger(); logger.Parameters = "logfile=" + logPath; engine.RegisterLogger(logger); System.Diagnostics.Trace.Write(String.Format("Compiling project (Build log {0})...", logPath), "information"); // Compile if (engine.BuildProject(project)) { System.Diagnostics.Trace.WriteLine("Success!", "information"); } else { System.Diagnostics.Trace.WriteLine("Fail", "information"); throw new InvalidOperationException("Failed compilation, operation cannot continue"); } engine.UnregisterAllLoggers(); } #endregion #region Windows Phone if (makeWP7Proj) { // Setup project attributes pg = phoneProj.AddNewPropertyGroup(false); property = pg.AddNewProperty("Configuration", "Release"); property.Condition = "'$(Configuration)' == ''"; property = pg.AddNewProperty("Platform", "AnyCPU"); property.Condition = "'$(Platform)' == ''"; pg.AddNewProperty("ProductVersion", "10.0.20506"); pg.AddNewProperty("SchemaVersion", "2.0"); pg.AddNewProperty("ProjectGuid", Guid.NewGuid().ToString()); pg.AddNewProperty("OutputType", "Library"); pg.AddNewProperty("AppDesignerFolder", "Properties"); pg.AddNewProperty("RootNamespace", parameters["rimbapi-target-ns"][0]); pg.AddNewProperty("AssemblyName", parameters["rimbapi-target-ns"][0] + ".Phone"); pg.AddNewProperty("ProjectTypeGuids", "{C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); pg.AddNewProperty("TargetFrameworkVersion", "v4.0"); pg.AddNewProperty("SilverlightVersion", "$(TargetFrameworkVersion)"); pg.AddNewProperty("TargetFrameworkProfile", "WindowsPhone71"); pg.AddNewProperty("TargetFrameworkIdentifier", "Silverlight"); pg.AddNewProperty("SilverlightApplication", "false"); pg.AddNewProperty("ValidateXaml", "true"); pg.AddNewProperty("ThrowErrorsInValidation", "true"); // Release AnyCPU pg = phoneProj.AddNewPropertyGroup(false); pg.Condition = "'$(Configuration)|$(Platform)' == 'Release|AnyCPU'"; pg.AddNewProperty("DebugType", "pdbonly"); pg.AddNewProperty("Optimize", "true"); pg.AddNewProperty("OutputPath", "bin\\release"); pg.AddNewProperty("DefineConstants", "TRACE;SILVERLIGHT;WINDOWS_PHONE"); pg.AddNewProperty("ErrorReport", "prompt"); pg.AddNewProperty("NoStdLib", "true"); pg.AddNewProperty("NoConfig", "true"); pg.AddNewProperty("WarningLevel", "4"); pg.AddNewProperty("DocumentationFile", "bin\\release\\" + parameters["rimbapi-target-ns"][0] + ".Phone.xml"); // Add reference structure refItemGroup = phoneProj.AddNewItemGroup(); refItemGroup.AddNewItem("Reference", "System"); refItemGroup.AddNewItem("Reference", "System.Xml"); BuildItem evReference = refItemGroup.AddNewItem("Reference", @"MARC.Everest.Phone"); evReference.SetMetadata("SpecificVersion", "false"); evReference.SetMetadata("HintPath", "lib\\MARC.Everest.Phone.dll"); // Add WP7 Imports phoneProj.AddNewImport(@"$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.$(TargetFrameworkProfile).Overrides.targets", null); phoneProj.AddNewImport(@"$(MSBuildExtensionsPath)\Microsoft\Silverlight for Phone\$(TargetFrameworkVersion)\Microsoft.Silverlight.CSharp.targets", null); // HACK: Add tools version string fileName = Path.Combine(hostContext.Output, ProjectFileName) + ".Phone.csproj"; phoneProj.Save(fileName); XmlDocument doc = new XmlDocument(); doc.Load(fileName); doc.DocumentElement.Attributes.Append(doc.CreateAttribute("ToolsVersion")); doc.DocumentElement.Attributes["ToolsVersion"].Value = "4.0"; doc.Save(fileName); if (parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { System.Diagnostics.Trace.Write(String.Format("Compiling phone project..."), "information"); // Compile if (phoneEngine.BuildProjectFile(fileName)) { System.Diagnostics.Trace.WriteLine("Success!", "information"); } else { System.Diagnostics.Trace.WriteLine("Fail", "information"); throw new InvalidOperationException("Failed compilation, operation cannot continue"); } } } #endregion #region Generate Formatter Assemblies // Generate the formatter assemblies if (genFormatters.Count > 0 && parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-compile"][0])) { AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); Trace.WriteLine("Generating ITS Formatter Types:", "information"); // Load the assembly Assembly genAsm = Assembly.LoadFile(Path.Combine(Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"), ProjectFileName + ".dll")); foreach (string s in genFormatters) { GenerateFormatterAssembly(s, genAsm, InteractionRenderer.profileId ?? "formatter"); } // Assembly resolve AppDomain.CurrentDomain.AssemblyResolve -= new ResolveEventHandler(CurrentDomain_AssemblyResolve); } else if (genFormatters.Count > 0) { Trace.WriteLine("Can't use --rimbapi-gen-its when --rimbapi-compile is not true, skipping ITS generation", "warn"); } #endregion // Does the user only want asm? #region dllonly if (parameters.ContainsKey("rimbapi-dllonly") && parameters.ContainsKey("rimbapi-compile") && Convert.ToBoolean(parameters["rimbapi-dllonly"][0])) { try { // Move the assemblies up to root foreach (string file in Directory.GetFiles(Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"))) { if (File.Exists(Path.Combine(hostContext.Output, Path.GetFileName(file)))) { File.Delete(Path.Combine(hostContext.Output, Path.GetFileName(file))); } File.Move(file, Path.Combine(hostContext.Output, Path.GetFileName(file))); } // Clean all in the projects and remove all directories List <String> directories = new List <string>(new string[] { Path.Combine(Path.Combine(hostContext.Output, "bin"), "release"), Path.Combine(hostContext.Output, "bin"), Path.Combine(hostContext.Output, "lib"), Path.Combine(hostContext.Output, "Vocabulary"), Path.Combine(hostContext.Output, "Interaction"), Path.Combine(hostContext.Output, "obj") }); // Gather files and clean foreach (Microsoft.Build.BuildEngine.BuildItem fi in fileItemGroup) { // Add directory on the "to be deleted" string dirName = Path.GetDirectoryName(Path.Combine(hostContext.Output, fi.Include)); if (!directories.Contains(dirName)) { directories.Add(dirName); } Trace.WriteLine(String.Format("Deleting {0}...", fi.Include), "debug"); File.Delete(Path.Combine(hostContext.Output, fi.Include)); } // Clean dirs foreach (string s in directories) { Directory.Delete(s, true); } File.Delete(project.FullFileName); } catch (Exception) { System.Diagnostics.Trace.WriteLine("Could not clean working files!", "warn"); } } #endregion }