Beispiel #1
0
        /// <summary>
        ///   Executes the task, generating the normalized files for the inputs.
        /// </summary>
        public override bool Execute()
        {
            try
            {
                // Ensure the intermediate directory exists
                var outPath = IntermediateDirectory.GetMetadata("FullPath");
                var intermediateDirectory = Path.Combine(outPath, "ssharp");
                Directory.CreateDirectory(intermediateDirectory);

                // Normalize the code; a value of null indicates that the project contains errors
                var compilationUnits = Normalize();
                if (compilationUnits == null)
                {
                    return(false);
                }

                // Write the output files to disk and return the paths
                OutputFiles = new ITaskItem[compilationUnits.Length];
                for (var i = 0; i < compilationUnits.Length; ++i)
                {
                    var path = Path.Combine(intermediateDirectory, i + ".cs");

                    OutputFiles[i] = new TaskItem(path);
                    File.WriteAllText(path, compilationUnits[i]);
                }

                return(true);
            }
            catch (TargetInvocationException e)
            {
                ReportException(e.InnerException);
                return(false);
            }
            catch (Exception e)
            {
                ReportException(e);
                return(false);
            }
        }
Beispiel #2
0
        public ArgumentsHandler(string[] args)
        {
            WorkingDirectory = Environment.CurrentDirectory.GetFullPath();

#if MonoGame
            Platform = "DesktopGL";
#else
            Platform = "XNA";
#endif
            Profile   = "Reach";
            Compress  = true;
            NumThread = Environment.ProcessorCount;
            Rebuild   = false;
            Quiet     = false;

            OutputDirectory       = (WorkingDirectory + "/bin/" + Platform).GetFullPath();
            IntermediateDirectory = (WorkingDirectory + "/obj/" + Platform).GetFullPath();

            GenerateMetaHash = false;
            GenerateMGCB     = false;

            foreach (KeyValuePair <string, string> item in ProcessArguement(args))
            {
                try
                {
                    if (item.Key.Equals("Content", StringComparison.OrdinalIgnoreCase) ||
                        item.Key.Equals("ContentDir", StringComparison.OrdinalIgnoreCase) ||
                        item.Key.Equals("ContentDirectory", StringComparison.OrdinalIgnoreCase) ||
                        item.Key.Equals("WorkingDir", StringComparison.OrdinalIgnoreCase) ||
                        item.Key.Equals("WorkingDirectory", StringComparison.OrdinalIgnoreCase))
                    {
                        WorkingDirectory = item.Value.GetFullPath();
                    }
                    else if (item.Key.Equals("Bin", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("BinDir", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("BinDirectory", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("OutputDir", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("OutputDirectory", StringComparison.OrdinalIgnoreCase))
                    {
                        OutputDirectory = item.Value.GetFullPath();
                    }
                    else if (item.Key.Equals("Obj", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("ObjDir", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("ObjDirectory", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("IntermediateDir", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("IntermediateDirectory", StringComparison.OrdinalIgnoreCase))
                    {
                        IntermediateDirectory = item.Value.GetFullPath();
                    }
                    else if (item.Key.Equals("Platform", StringComparison.OrdinalIgnoreCase))
                    {
                        Platform = item.Value;
                    }
                    else if (item.Key.Equals("Profile", StringComparison.OrdinalIgnoreCase))
                    {
                        Profile = item.Value;
                    }
                    else if (item.Key.Equals("Compress", StringComparison.OrdinalIgnoreCase))
                    {
                        Compress = item.Value.ToBoolean();
                    }
                    else if (item.Key.Equals("Thread", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("NumThread", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("NumberOfThread", StringComparison.OrdinalIgnoreCase))
                    {
                        NumThread = item.Value.ToInt32();
                    }
                    else if (item.Key.Equals("Rebuild", StringComparison.OrdinalIgnoreCase))
                    {
                        Rebuild = item.Value.ToBoolean();
                    }
                    else if (item.Key.Equals("Quiet", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("Slient", StringComparison.OrdinalIgnoreCase))
                    {
                        Quiet = item.Value.ToBoolean();
                    }
                    else if (item.Key.Equals("DumpMeta", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("DumpMetaHash", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenMeta", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenerateMeta", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenMetaHash", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenerateMataHash", StringComparison.OrdinalIgnoreCase))
                    {
                        GenerateMetaHash = item.Value.ToBoolean();
                    }
                    else if (item.Key.Equals("DumpMGCB", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenMGCB", StringComparison.OrdinalIgnoreCase) ||
                             item.Key.Equals("GenerateMGCB", StringComparison.OrdinalIgnoreCase))
                    {
                        GenerateMGCB = item.Value.ToBoolean();
                    }
                }
                catch (Exception) { }
            }

            if (!Directory.Exists(WorkingDirectory))
            {
                Console.Error.WriteLine("Invalid working directory.");
                Environment.Exit(-1);
            }

            if (Platform.Equals("XNA", StringComparison.OrdinalIgnoreCase))
            {
                if (Environment.Is64BitProcess)
                {
                    Console.Error.WriteLine("The XNA content tools only work on a 32 bit application.");
                    Environment.Exit(-1);
                }
                else if (Environment.OSVersion.Platform != PlatformID.Win32NT)
                {
                    Console.Error.WriteLine("The XNA content tools only work on a windows platform.");
                    Environment.Exit(-1);
                }
                else if (Environment.ExpandEnvironmentVariables("%XNAGSv4%").Equals("%XNAGSv4%", StringComparison.OrdinalIgnoreCase) || !Directory.Exists(Environment.ExpandEnvironmentVariables("%XNAGSv4%").GetFullPath()))
                {
                    Console.Error.WriteLine("Unable to find XNA game studio 4.0.");
                    Environment.Exit(-1);
                }

                BuildTool = new Version(1, 4, 0, 0);
            }
            else if (Platform.Equals("DesktopGL", StringComparison.OrdinalIgnoreCase) || Platform.Equals("Windows", StringComparison.OrdinalIgnoreCase))
            {
                if (!Environment.Is64BitProcess)
                {
                    Console.Error.WriteLine("The MonoGame content tools only work on a 64 bit application.");
                    Environment.Exit(-1);
                }
                else if (Environment.OSVersion.Platform != PlatformID.Win32NT)
                {
                    Console.Error.WriteLine("The MonoGame content tools only work on a windows platform.");
                    Environment.Exit(-1);
                }

                BuildTool = Assembly.LoadFile((AppDomain.CurrentDomain.BaseDirectory + "/MonoGame.Framework.Content.Pipeline.dll").GetFullPath()).GetName().Version;
            }
            else
            {
                Console.Error.WriteLine("Unknown Platform.");
                Environment.Exit(-1);
            }

            if (!Profile.Equals("Reach", StringComparison.OrdinalIgnoreCase) && !Profile.Equals("HiDef", StringComparison.OrdinalIgnoreCase))
            {
                Console.Error.WriteLine("Unknown Profile.");
                Environment.Exit(-1);
            }

            OutputDirectory.CreateDirectoryIfNotExists();
            IntermediateDirectory.CreateDirectoryIfNotExists();
        }
Beispiel #3
0
        public Task <bool> ExecuteAsync(CancellationToken token = default)
        {
            // parse
            var(pluginType, excludedMethods, pluginClass, pluginAssemblyName) = AnalyzeAssembly(AssemblyFile);

            _log.LogMessage($"PluginAssembly: {pluginAssemblyName.FullName}");
            _log.LogMessage($"Type:           {pluginType}");
            _log.LogMessage($"Class:          {pluginClass}");
            _log.LogInfo($"ExcludedMethods:");
            foreach (var method in excludedMethods)
            {
                _log.LogInfo($"    {method}");
            }

            var outDir  = IntermediateDirectory.CreateSubdirectory("out");
            var workDir = IntermediateDirectory.CreateSubdirectory(nameof(TcBuild));

            var outFile   = new FileInfo(Path.Combine(outDir.FullName, GetOutputFileName(pluginType, x64: false)));
            var outFile64 = new FileInfo(Path.Combine(outDir.FullName, GetOutputFileName(pluginType, x64: true)));

            // .config
            var config = new FileInfo(AssemblyFile.FullName + ".config");

            try {
                token.ThrowIfCancellationRequested();

                // process
                var wrapperSource = ProcessSource(pluginType, excludedMethods, pluginClass, pluginAssemblyName);
                _log.LogInfo($"{wrapperSource.FullName}");

                token.ThrowIfCancellationRequested();

                // ico resource
                FileInfo resFile = new FileInfo(Path.Combine(workDir.FullName, $"{AssemblyFile.Name}.res"));
                _tools.TryCreateResFile(AssemblyFile, resFile);

                // create: x86
                _tools.Assemble(wrapperSource, outFile, resFile, false, IsRelease);
                _log.LogInfo($"{outFile.FullName}");

                token.ThrowIfCancellationRequested();

                // create: x64
                _tools.Assemble(wrapperSource, outFile64, resFile, true, IsRelease);
                _log.LogInfo($"{outFile64.FullName}");

                token.ThrowIfCancellationRequested();

                // Zip
                if (pluginType != PluginType.QuickSearch)
                {
                    var zipFile = new FileInfo(Path.Combine(outDir.FullName, Path.ChangeExtension(AssemblyFile.Name, ".zip")));
                    var iniFile = new FileInfo(Path.Combine(workDir.FullName, "pluginst.inf"));

                    _log.LogInfo(zipFile.FullName);

                    CreatePluginstFile(iniFile, outFile, pluginType);

                    var success = _tools.CreateZip(zipFile,
                                                   new[] {
                        iniFile,
                        outFile,
                        outFile64,
                        config,
                        AssemblyFile,
                        new FileInfo(Path.ChangeExtension(AssemblyFile.FullName, ".pdb")),
                    }.Concat(ReferenceFiles.Where(_ => _.Extension != ".xml" && _.Name != "TcPluginBase.dll")
                             // Hotfix until my pull request gets merged: https://github.com/peters/ILRepack.MSBuild.Task/pull/42
                             //.Where(_ => _.Name != "Microsoft.Build.Framework.dll")
                             //.Where(_ => _.Name != "Microsoft.Build.Utilities.Core.dll")
                             //.Where(_ => _.Name != "System.Collections.Immutable.dll")
                             ),
                                                   GetSatelliteAssemblyFiles()
                                                   );
                    if (!success)
                    {
                        _log.LogWarning("ZIP Archiver is not found - Installation Archive is not created.");
                    }
                }

                token.ThrowIfCancellationRequested();

                return(Task.FromResult(true));
            }
            finally {
                // Cleanup
                //AssemblyFile.Delete();
                workDir.Delete(true);
            }
        }