public int Generate(string wszInputFilePath, string bstrInputFileContents, string wszDefaultNamespace,
                                IntPtr[] pbstrOutputFileContents, out uint pbstrOutputFileContentSize, IVsGeneratorProgress pGenerateProgress)
            {
                // wait for debugger on var
                DebuggerHelper.WaitForDebuggerIfEnabled("NFRESXCODEGEN_DEBUG");

                if (bstrInputFileContents == null)
                {
                    throw new ArgumentNullException(bstrInputFileContents);
                }
                codeFilePath          = wszInputFilePath;
                codeFileNameSpace     = wszDefaultNamespace;
                codeGeneratorProgress = pGenerateProgress;

                byte[] bytes = GenerateCode(wszInputFilePath, bstrInputFileContents);
                if (bytes == null)
                {
                    pbstrOutputFileContents[0] = IntPtr.Zero;
                    pbstrOutputFileContentSize = 0;
                }
                else
                {
                    pbstrOutputFileContents[0] = Marshal.AllocCoTaskMem(bytes.Length);
                    Marshal.Copy(bytes, 0, pbstrOutputFileContents[0], bytes.Length);
                    pbstrOutputFileContentSize = (uint)bytes.Length;
                }
                return(COM_HResults.S_OK);
            }
Example #2
0
        public override bool Execute()
        {
            // report to VS output window what step the build is
            Log.LogCommandLine(MessageImportance.Normal, "Starting nanoFramework MetaDataProcessor...");

            // wait for debugger on var
            DebuggerHelper.WaitForDebuggerIfEnabled(TasksConstants.BuildTaskDebugVar);

            try
            {
                // execute the ToolTask base method which is running the command line to call MetaDataProcessor will the appropriate parameters
                base.Execute();

                RecordFilesWritten();
            }
            catch (Exception ex)
            {
                Log.LogError("nanoFramework build error: " + ex.Message);
            }
            finally
            {
                Cleanup();
            }

            // if we've logged any errors that's because there were errors (WOW!)
            return(!Log.HasLoggedErrors);
        }
        public override bool Execute()
        {
            // report to VS output window what step the build is
            Log.LogMessage(MessageImportance.Normal, "Generating binary output file...");

            // wait for debugger on var
            DebuggerHelper.WaitForDebuggerIfEnabled(TasksConstants.BuildTaskDebugVar);

            // default with null, indicating that we've generated nothing
            FileWritten = null;

            // get paths for PE files
            // rename extension .dll with .pe
            List <string> peCollection = new List <string>();

            peCollection = AssemblyReferences?.Select(a => { return(a.GetMetadata("FullPath").Replace(".dll", ".pe").Replace(".exe", ".pe")); }).ToList();

            // add executable PE
            peCollection.Add(AssemblyPE);

            // get executable path and file name
            // rename executable extension .exe with .bin
            var binOutputFile = Assembly.Replace(".exe", ".bin");

            using (FileStream binFile = new FileStream(binOutputFile, FileMode.Create))
            {
                // now we will re-deploy all system assemblies
                foreach (string peItem in peCollection)
                {
                    // append to the deploy blob the assembly
                    using (FileStream fs = File.Open(peItem, FileMode.Open, FileAccess.Read))
                    {
                        long   length = (fs.Length + 3) / 4 * 4;
                        byte[] buffer = new byte[length];

                        fs.Read(buffer, 0, (int)fs.Length);

                        // copy this assembly to the bin file too
                        binFile.Write(buffer, 0, (int)length);
                    }
                }
            }

            // bin file written
            FileWritten = new TaskItem(binOutputFile);

            return(true);
        }
        public override bool Execute()
        {
            // report to VS output window what step the build is
            Log.LogMessage(MessageImportance.Normal, "Generating nanoResources nanoFramework assembly...");

            // wait for debugger on var
            DebuggerHelper.WaitForDebuggerIfEnabled(TasksConstants.BuildTaskDebugVar);

            try
            {
                // If there are no sources to process, just return (with success) and report the condition.
                if ((Sources == null) || (Sources.Length == 0))
                {
                    Log.LogMessage(MessageImportance.Low, "GenerateResource.NoSources");

                    // Indicate we generated nothing
                    OutputResources = null;

                    return(true);
                }

                if (!ValidateParameters())
                {
                    // Indicate we generated nothing
                    OutputResources = null;
                    return(false);
                }

                // In the case that OutputResources wasn't set, build up the outputs by transforming the Sources
                if (!CreateOutputResourcesNames())
                {
                    // Indicate we generated nothing
                    OutputResources = null;
                    return(false);
                }

                // First we look to see if we have a resgen linked files cache.  If so, then we can use that
                // cache to speed up processing.
                ReadStateFile();

                bool nothingOutOfDate = true;

                List <ITaskItem> inputsToProcess  = new List <ITaskItem>();
                List <ITaskItem> outputsToProcess = new List <ITaskItem>();

                // decide what sources we need to build
                for (int i = 0; i < Sources.Length; ++i)
                {
                    // Attributes from input items are forwarded to output items.
                    //Sources[i].CopyMetadataTo(OutputResources[i]);

                    if (!File.Exists(Sources[i].ItemSpec))
                    {
                        // Error but continue with the files that do exist
                        Log.LogError("GenerateResource.ResourceNotFound", Sources[i].ItemSpec);
                        UnsuccessfullyCreatedOutFiles.Add(OutputResources[i].ItemSpec);
                    }
                    else
                    {
                        // check to see if the output resources file (and, if it is a .resx, any linked files)
                        // is up to date compared to the input file
                        if (ShouldRebuildResgenOutputFile(Sources[i].ItemSpec, OutputResources[i].ItemSpec))
                        {
                            nothingOutOfDate = false;

                            inputsToProcess.Add(Sources[i]);
                            outputsToProcess.Add(OutputResources[i]);
                        }
                    }
                }

                if (nothingOutOfDate)
                {
                    Log.LogMessage("GenerateResource.NothingOutOfDate");
                }
                else
                {
                    // Prepare list of referenced assemblies
                    AssemblyName[] assemblyList;
                    try
                    { //only load system.drawing, mscorlib.  no parameters needed here?!!
                        assemblyList = LoadReferences();
                    }
                    catch (ArgumentException e)
                    {
                        Log.LogError("GenerateResource.ReferencedAssemblyNotFound - {0}: {1}", e.ParamName, e.Message);
                        OutputResources = null;
                        return(false);
                    }

                    // always create a separate AppDomain because an assembly would be locked.
                    AppDomain appDomain = null;

                    ProcessResourceFiles process = null;

                    try
                    {
                        appDomain = AppDomain.CreateDomain
                                    (
                            "generateResourceAppDomain",
                            null,
                            AppDomain.CurrentDomain.SetupInformation
                                    );

                        object obj = appDomain.CreateInstanceFromAndUnwrap
                                     (
                            typeof(ProcessResourceFiles).Module.FullyQualifiedName,
                            typeof(ProcessResourceFiles).FullName
                                     );

                        Type processType = obj.GetType();

                        process = (ProcessResourceFiles)obj;


                        //setup strongly typed class name??

                        process.Run(Log, assemblyList, (ITaskItem[])inputsToProcess.ToArray(), (ITaskItem[])outputsToProcess.ToArray(),
                                    UseSourcePath);

                        if (null != process.UnsuccessfullyCreatedOutFiles)
                        {
                            foreach (string item in process.UnsuccessfullyCreatedOutFiles)
                            {
                                UnsuccessfullyCreatedOutFiles.Add(item);
                            }
                        }
                        process = null;
                    }
                    finally
                    {
                        if (appDomain != null)
                        {
                            AppDomain.Unload(appDomain);
                            process   = null;
                            appDomain = null;
                        }
                    }
                }

                // And now we serialize the cache to save our resgen linked file resolution for later use.
                WriteStateFile();

                RemoveUnsuccessfullyCreatedResourcesFromOutputResources();

                RecordFilesWritten();
            }
            catch (Exception ex)
            {
                Log.LogError("nanoFramework GenerateNanoResourceTask error: " + ex.Message);
            }

            // if we've logged any errors that's because there were errors (WOW!)
            return(!Log.HasLoggedErrors);
        }