public void TestGenerateToFile() { string xml = @"<ProjectSchemaDefinitions xmlns=`clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework` xmlns:x=`http://schemas.microsoft.com/winfx/2006/xaml` xmlns:sys=`clr-namespace:System;assembly=mscorlib` xmlns:impl=`clr-namespace:Microsoft.VisualStudio.Project.Contracts.Implementation;assembly=Microsoft.VisualStudio.Project.Contracts.Implementation`> <Rule Name=`CL`> <EnumProperty Name=`GeneratePreprocessedFile` Switch=`nologo`> <EnumValue Name=`Disabled` /> <EnumValue Name=`Yes` Switch=`P` /> <EnumValue Name=`NoLineNumbers` Switch=`EP` /> </EnumProperty> </Rule> </ProjectSchemaDefinitions>"; TaskParser tp = XamlTestHelpers.LoadAndParse(xml, "CL"); TaskGenerator tg = new TaskGenerator(tp); CodeCompileUnit compileUnit = tg.GenerateCode(); CodeDomProvider codeGenerator = CodeDomProvider.CreateProvider("CSharp"); try { using (StreamWriter sw = new StreamWriter("XamlTaskFactory_Tests_TestGenerateToFile.cs")) { CodeGeneratorOptions options = new CodeGeneratorOptions(); options.BlankLinesBetweenMembers = true; options.BracingStyle = "C"; codeGenerator.GenerateCodeFromCompileUnit(compileUnit, sw, options); } CSharpCodeProvider provider = new CSharpCodeProvider(); // Build the parameters for source compilation. CompilerParameters cp = new CompilerParameters(); // Add an assembly reference. cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("System.Xml.dll"); cp.ReferencedAssemblies.Add(Path.Combine(XamlTestHelpers.PathToMSBuildBinaries, "Microsoft.Build.Utilities.Core.dll")); cp.ReferencedAssemblies.Add(Path.Combine(XamlTestHelpers.PathToMSBuildBinaries, "Microsoft.Build.Tasks.Core.dll")); cp.ReferencedAssemblies.Add(Path.Combine(XamlTestHelpers.PathToMSBuildBinaries, "Microsoft.Build.Framework.dll")); cp.ReferencedAssemblies.Add("System.Data.dll"); // Generate an executable instead of // a class library. cp.GenerateExecutable = false; // Set the assembly file name to generate. cp.GenerateInMemory = true; // Invoke compilation CompilerResults cr = provider.CompileAssemblyFromFile(cp, "XamlTaskFactory_Tests_TestGenerateToFile.cs"); Assert.Empty(cr.Errors); // "Compilation Failed" } finally { if (File.Exists("XamlTaskFactory_Tests_TestGenerateToFile.cs")) { File.Delete("XamlTaskFactory_Tests_TestGenerateToFile.cs"); } } }
public static Assembly SetupGeneratedCode(string xml) { TaskParser tp = null; try { tp = LoadAndParse(xml, "FakeTask"); } catch (XamlParseException) { Assert.True(false, "Parse of FakeTask XML failed"); } TaskGenerator tg = new TaskGenerator(tp); CodeCompileUnit compileUnit = tg.GenerateCode(); CodeDomProvider codeGenerator = CodeDomProvider.CreateProvider("CSharp"); using (StringWriter sw = new StringWriter(CultureInfo.CurrentCulture)) { CodeGeneratorOptions options = new CodeGeneratorOptions(); options.BlankLinesBetweenMembers = true; options.BracingStyle = "C"; codeGenerator.GenerateCodeFromCompileUnit(compileUnit, sw, options); CSharpCodeProvider provider = new CSharpCodeProvider(); // Build the parameters for source compilation. CompilerParameters cp = new CompilerParameters(); // Add an assembly reference. cp.ReferencedAssemblies.Add("System.dll"); cp.ReferencedAssemblies.Add("System.Data.dll"); cp.ReferencedAssemblies.Add("System.Xml.dll"); cp.ReferencedAssemblies.Add(Path.Combine(PathToMSBuildBinaries, "net.r_eg.IeXod.Framework.dll")); cp.ReferencedAssemblies.Add(Path.Combine(PathToMSBuildBinaries, "net.r_eg.IeXod.Utilities.Core.dll")); cp.ReferencedAssemblies.Add(Path.Combine(PathToMSBuildBinaries, "net.r_eg.IeXod.Tasks.Core.dll")); // Generate an executable instead of // a class library. cp.GenerateExecutable = false; // Set the assembly file name to generate. cp.GenerateInMemory = true; // Invoke compilation CompilerResults cr = provider.CompileAssemblyFromSource(cp, sw.ToString()); foreach (CompilerError error in cr.Errors) { Console.WriteLine(error.ToString()); } if (cr.Errors.Count > 0) { Console.WriteLine(sw.ToString()); } Assert.Empty(cr.Errors); if (cr.Errors.Count > 0) { foreach (CompilerError error in cr.Errors) { Console.WriteLine(error.ErrorText); } } return(cr.CompiledAssembly); } }
/// <summary> /// MSBuild engine will call this to initialize the factory. This should initialize the factory enough so that the factory can be asked /// whether or not task names can be created by the factory. /// </summary> public bool Initialize(string taskName, IDictionary <string, TaskPropertyInfo> taskParameters, string taskElementContents, IBuildEngine taskFactoryLoggingHost) { ErrorUtilities.VerifyThrowArgumentNull(taskName, nameof(taskName)); ErrorUtilities.VerifyThrowArgumentNull(taskParameters, nameof(taskParameters)); var log = new TaskLoggingHelper(taskFactoryLoggingHost, taskName) { TaskResources = AssemblyResources.PrimaryResources, HelpKeywordPrefix = "MSBuild." }; if (taskElementContents == null) { log.LogErrorWithCodeFromResources("Xaml.MissingTaskBody"); return(false); } TaskElementContents = taskElementContents.Trim(); // Attempt to load the task TaskParser parser = new TaskParser(); bool parseSuccessful = parser.Parse(TaskElementContents, taskName); TaskName = parser.GeneratedTaskName; TaskNamespace = parser.Namespace; var generator = new TaskGenerator(parser); CodeCompileUnit dom = generator.GenerateCode(); string pathToMSBuildBinaries = ToolLocationHelper.GetPathToBuildTools(ToolLocationHelper.CurrentToolsVersion); // create the code generator options // Since we are running msbuild 12.0 these had better load. var compilerParameters = new CompilerParameters ( new[] { "System.dll", Path.Combine(pathToMSBuildBinaries, "Microsoft.Build.Framework.dll"), Path.Combine(pathToMSBuildBinaries, "Microsoft.Build.Utilities.Core.dll"), Path.Combine(pathToMSBuildBinaries, "Microsoft.Build.Tasks.Core.dll") } ) { GenerateInMemory = true, TreatWarningsAsErrors = false }; // create the code provider var codegenerator = CodeDomProvider.CreateProvider("cs"); CompilerResults results; bool debugXamlTask = Environment.GetEnvironmentVariable("MSBUILDWRITEXAMLTASK") == "1"; if (debugXamlTask) { using (var outputWriter = new StreamWriter(taskName + "_XamlTask.cs")) { var options = new CodeGeneratorOptions { BlankLinesBetweenMembers = true, BracingStyle = "C" }; codegenerator.GenerateCodeFromCompileUnit(dom, outputWriter, options); } results = codegenerator.CompileAssemblyFromFile(compilerParameters, taskName + "_XamlTask.cs"); } else { results = codegenerator.CompileAssemblyFromDom(compilerParameters, dom); } try { _taskAssembly = results.CompiledAssembly; } catch (FileNotFoundException) { // This occurs if there is a failure to compile the assembly. We just pass through because we will take care of the failure below. } if (_taskAssembly == null) { var errorList = new StringBuilder(); errorList.AppendLine(); foreach (CompilerError error in results.Errors) { if (error.IsWarning) { continue; } if (debugXamlTask) { errorList.AppendFormat(Thread.CurrentThread.CurrentUICulture, "({0},{1}) {2}", error.Line, error.Column, error.ErrorText).AppendLine(); } else { errorList.AppendLine(error.ErrorText); } } log.LogErrorWithCodeFromResources("Xaml.TaskCreationFailed", errorList.ToString()); } return(!log.HasLoggedErrors); }