예제 #1
0
        /// <summary>
        /// Display an error message to the end user.
        /// </summary>
        /// <param name="text">Humanly readable message describing the error</param>
        /// <param name="code">Unique error ID. Please see https://github.com/mono/linker/blob/master/doc/error-codes.md for the list of errors and possibly add a new one</param>
        /// <param name="subcategory">Optionally, further categorize this error</param>
        /// <param name="origin">Filename, line, and column where the error was found</param>
        /// <returns>New MessageContainer of 'Error' category</returns>
        public void LogError(string text, int code, string subcategory = MessageSubCategory.None, MessageOrigin?origin = null)
        {
            if (!LogMessages)
            {
                return;
            }

            var error = MessageContainer.CreateErrorMessage(text, code, subcategory, origin);

            LogMessage(error);
        }
예제 #2
0
        /// <summary>
        /// Display an error message to the end user.
        /// </summary>
        /// <param name="text">Humanly readable message describing the error</param>
        /// <param name="code">Unique error ID. Please see https://github.com/mono/linker/blob/master/doc/error-codes.md for the list of errors and possibly add a new one</param>
        /// <param name="subcategory">Optionally, further categorize this error</param>
        /// <param name="origin">Filename, line, and column where the error was found</param>
        /// <returns>New MessageContainer of 'Error' category</returns>
        public void LogError(string text, int code, string subcategory = MessageSubCategory.None, MessageOrigin?origin = null, bool isWarnAsError = false, WarnVersion?version = null)
        {
            if (!LogMessages)
            {
                return;
            }

            var error = MessageContainer.CreateErrorMessage(text, code, subcategory, origin, isWarnAsError, version);

            LogMessage(error);
        }
예제 #3
0
        public void ParseXml(string document)
        {
            _xmlDocumentLocation = document;
            _document            = new XPathDocument(_xmlDocumentLocation);

            XPathNavigator nav = _document.CreateNavigator();

            if (!nav.MoveToChild("linker", string.Empty))
            {
                return;
            }

            try {
                ProcessAssemblies(_context, nav.SelectChildren("assembly", string.Empty));
            } catch (Exception ex) when(!(ex is LinkerFatalErrorException))
            {
                throw new LinkerFatalErrorException(MessageContainer.CreateErrorMessage($"Error processing '{_xmlDocumentLocation}'", 1013), ex);
            }
        }
예제 #4
0
        public virtual ICollection <AssemblyDefinition> ResolveReferences(AssemblyDefinition assembly)
        {
            List <AssemblyDefinition> references = new List <AssemblyDefinition> ();

            if (assembly == null)
            {
                return(references);
            }

            foreach (AssemblyNameReference reference in assembly.MainModule.AssemblyReferences)
            {
                try {
                    AssemblyDefinition definition = Resolve(reference);
                    if (definition != null)
                    {
                        references.Add(definition);
                    }
                } catch (Exception e) {
                    throw new LinkerFatalErrorException(MessageContainer.CreateErrorMessage($"Assembly '{assembly.FullName}' reference '{reference.FullName}' could not be resolved", 1009), e);
                }
            }
            return(references);
        }
예제 #5
0
        public bool Run(ILogger customLogger = null)
        {
            int setupStatus = SetupContext(customLogger);

            if (setupStatus > 0)
            {
                return(true);
            }
            if (setupStatus < 0)
            {
                return(false);
            }

            Pipeline p = context.Pipeline;

            PreProcessPipeline(p);

            try {
                p.Process(context);
            } catch (Exception ex) {
                if (ex is LinkerFatalErrorException lex)
                {
                    context.LogMessage(lex.MessageContainer);
                    Console.Error.WriteLine(ex.ToString());
                }
                else
                {
                    context.LogMessage(MessageContainer.CreateErrorMessage($"IL Linker has encountered an unexpected error. Please report the issue at https://github.com/mono/linker/issues \n{ex}", 1012));
                }

                return(false);
            } finally {
                context.Tracer.Finish();
            }

            return(true);
        }