コード例 #1
0
        private bool VerifyLoggerBuildEvent(BuildOutputLogger loggerSender,
                                            BuildEventArgs eventArgs, ErrorLevel errorLevel)
        {
            var  bec          = eventArgs.BuildEventContext;
            bool becIsInvalid = (bec == null ||
                                 bec == BuildEventContext.Invalid ||
                                 bec.ProjectContextId == BuildEventContext.InvalidProjectContextId ||
                                 bec.ProjectInstanceId == BuildEventContext.InvalidProjectInstanceId);

            if (becIsInvalid)
            {
                return(false);
            }

            if (errorLevel == ErrorLevel.Message)
            {
                var  messageEventArgs = (BuildMessageEventArgs)eventArgs;
                bool isUserMessage    = (messageEventArgs.Importance == MessageImportance.High && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Minimal)) ||
                                        (messageEventArgs.Importance == MessageImportance.Normal && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Normal)) ||
                                        (messageEventArgs.Importance == MessageImportance.Low && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Detailed));

                if (!isUserMessage)
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #2
0
        public static RegisterLoggerResult Register(
            Guid loggerId,
            LoggerVerbosity loggerVerbosity,
            out BuildOutputLogger buildLogger)
        {
            try
            {
                const BindingFlags InterfacePropertyFlags = BindingFlags.GetProperty
                                                            | BindingFlags.Public
                                                            | BindingFlags.Instance;

                BuildManager buildManager          = BuildManager.DefaultBuildManager;
                Type         buildHostType         = buildManager.GetType().Assembly.GetType("Microsoft.Build.BackEnd.IBuildComponentHost");
                PropertyInfo loggingSeviceProperty = buildHostType.GetProperty("LoggingService", InterfacePropertyFlags);

                object loggingServiceObj;
                try
                {
                    // Microsoft.Build.BackEnd.ILoggingService
                    loggingServiceObj = loggingSeviceProperty.GetValue(buildManager, null);
                }
                catch (TargetInvocationException ex)
                {
                    ex.Trace("Microsoft.Build.BackEnd.ILoggingService is not available.");
                    buildLogger = null;
                    return(RegisterLoggerResult.FatalError);
                }

                PropertyInfo          loggersProperty = loggingServiceObj.GetType().GetProperty("Loggers", InterfacePropertyFlags);
                ICollection <ILogger> loggers         = (ICollection <ILogger>)loggersProperty.GetValue(loggingServiceObj, null);

                ILogger logger = loggers.FirstOrDefault(x => x is BuildOutputLogger && ((BuildOutputLogger)x)._id.Equals(loggerId));
                if (logger != null)
                {
                    buildLogger           = (BuildOutputLogger)logger;
                    buildLogger.Verbosity = loggerVerbosity;
                    return(RegisterLoggerResult.AlreadyExists);
                }

                MethodInfo registerLoggerMethod = loggingServiceObj.GetType().GetMethod("RegisterLogger");
                buildLogger = new BuildOutputLogger(loggerId)
                {
                    Verbosity = loggerVerbosity
                };
                bool registerResult = (bool)registerLoggerMethod.Invoke(loggingServiceObj, new object[] { buildLogger });

                return(registerResult ? RegisterLoggerResult.RegisterSuccess : RegisterLoggerResult.RegisterFailed);
            }
            catch (Exception ex)
            {
                ex.TraceUnknownException();
                buildLogger = null;
                return(RegisterLoggerResult.FatalError);
            }
        }
コード例 #3
0
        private void EventSource_ErrorRaised(
            BuildOutputLogger loggerSender,
            LazyFormattedBuildEventArgs e,
            ErrorLevel errorLevel)
        {
            try
            {
                bool verified = VerifyLoggerBuildEvent(loggerSender, e, errorLevel);
                if (!verified)
                {
                    return;
                }

                int projectInstanceId = e.BuildEventContext.ProjectInstanceId;
                int projectContextId  = e.BuildEventContext.ProjectContextId;

                BuildProjectContextEntry projectEntry = loggerSender.Projects.Find(t =>
                                                                                   t.InstanceId == projectInstanceId &&
                                                                                   t.ContextId == projectContextId);

                if (projectEntry == null)
                {
                    TraceManager.Trace(
                        string.Format(
                            "Project entry not found by ProjectInstanceId='{0}' and ProjectContextId='{1}'.",
                            projectInstanceId,
                            projectContextId),
                        EventLogEntryType.Warning);

                    return;
                }

                if (projectEntry.IsInvalid)
                {
                    return;
                }

                ProjectItem projectItem;
                if (!GetProjectItem(projectEntry, out projectItem))
                {
                    projectEntry.IsInvalid = true;
                    return;
                }

                BuildedProject buildedProject = _buildedProjects[projectItem];
                buildedProject.ErrorsBox.Keep(errorLevel, e);
                OnErrorRaised(this, new BuildErrorRaisedEventArgs(errorLevel, buildedProject));
            }
            catch (Exception ex)
            {
                ex.TraceUnknownException();
            }
        }
コード例 #4
0
        public static RegisterLoggerResult Register(
            Guid loggerId, 
            LoggerVerbosity loggerVerbosity, 
            out BuildOutputLogger buildLogger)
        {
            try
            {
                const BindingFlags InterfacePropertyFlags = BindingFlags.GetProperty
                                                            | BindingFlags.Public
                                                            | BindingFlags.Instance;

                BuildManager buildManager = BuildManager.DefaultBuildManager;
                Type buildHostType = buildManager.GetType().Assembly.GetType("Microsoft.Build.BackEnd.IBuildComponentHost");
                PropertyInfo loggingSeviceProperty = buildHostType.GetProperty("LoggingService", InterfacePropertyFlags);

                object loggingServiceObj;
                try
                {
                    // Microsoft.Build.BackEnd.ILoggingService
                    loggingServiceObj = loggingSeviceProperty.GetValue(buildManager, null);
                }
                catch (TargetInvocationException ex)
                {
                    ex.Trace("Microsoft.Build.BackEnd.ILoggingService is not available.");
                    buildLogger = null;
                    return RegisterLoggerResult.FatalError;
                }

                PropertyInfo loggersProperty = loggingServiceObj.GetType().GetProperty("Loggers", InterfacePropertyFlags);
                ICollection<ILogger> loggers = (ICollection<ILogger>)loggersProperty.GetValue(loggingServiceObj, null);

                ILogger logger = loggers.FirstOrDefault(x => x is BuildOutputLogger && ((BuildOutputLogger)x)._id.Equals(loggerId));
                if (logger != null)
                {
                    buildLogger = (BuildOutputLogger)logger;
                    buildLogger.Verbosity = loggerVerbosity;
                    return RegisterLoggerResult.AlreadyExists;
                }

                MethodInfo registerLoggerMethod = loggingServiceObj.GetType().GetMethod("RegisterLogger");
                buildLogger = new BuildOutputLogger(loggerId) { Verbosity = loggerVerbosity };
                bool registerResult = (bool)registerLoggerMethod.Invoke(loggingServiceObj, new object[] { buildLogger });

                return registerResult ? RegisterLoggerResult.RegisterSuccess : RegisterLoggerResult.RegisterFailed;
            }
            catch (Exception ex)
            {
                ex.TraceUnknownException();
                buildLogger = null;
                return RegisterLoggerResult.FatalError;
            }
        }
コード例 #5
0
        private void RegisterLogger()
        {
            _buildLogger = null;

            // Same Verbosity as in the Error List.
            const LoggerVerbosity LoggerVerbosity = LoggerVerbosity.Quiet;
            RegisterLoggerResult  result          = BuildOutputLogger.Register(_parsingErrorsLoggerId, LoggerVerbosity, out _buildLogger);

            if (result == RegisterLoggerResult.RegisterSuccess)
            {
                var eventSource = _buildLogger.EventSource;
                eventSource.MessageRaised += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Message);
                eventSource.WarningRaised += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Warning);
                eventSource.ErrorRaised   += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Error);
            }
            else if (result == RegisterLoggerResult.AlreadyExists)
            {
                if (_buildLogger.Projects != null)
                {
                    _buildLogger.Projects.Clear();
                }
            }
        }
コード例 #6
0
        private void EventSource_ErrorRaised(
            BuildOutputLogger loggerSender,
            LazyFormattedBuildEventArgs e,
            ErrorLevel errorLevel)
        {
            try
            {
                bool verified = VerifyLoggerBuildEvent(loggerSender, e, errorLevel);
                if (!verified)
                    return;

                int projectInstanceId = e.BuildEventContext.ProjectInstanceId;
                int projectContextId = e.BuildEventContext.ProjectContextId;

                BuildProjectContextEntry projectEntry = loggerSender.Projects.Find(t =>
                    t.InstanceId == projectInstanceId
                    && t.ContextId == projectContextId);

                if (projectEntry == null)
                {
                    TraceManager.Trace(
                        string.Format(
                            "Project entry not found by ProjectInstanceId='{0}' and ProjectContextId='{1}'.",
                            projectInstanceId,
                            projectContextId), 
                        EventLogEntryType.Warning);

                    return;
                }

                if (projectEntry.IsInvalid)
                    return;

                ProjectItem projectItem;
                if (!GetProjectItem(projectEntry, out projectItem))
                {
                    projectEntry.IsInvalid = true;
                    return;
                }

                BuildedProject buildedProject = _buildedProjects[projectItem];
                buildedProject.ErrorsBox.Keep(errorLevel, e);
                OnErrorRaised(this, new BuildErrorRaisedEventArgs(errorLevel, buildedProject));
            }
            catch (Exception ex)
            {
                ex.TraceUnknownException();
            }
        }
コード例 #7
0
        private bool VerifyLoggerBuildEvent(BuildOutputLogger loggerSender, 
            BuildEventArgs eventArgs, ErrorLevel errorLevel)
        {
            var bec = eventArgs.BuildEventContext;
            bool becIsInvalid = (bec == null
                                 || bec == BuildEventContext.Invalid
                                 || bec.ProjectContextId == BuildEventContext.InvalidProjectContextId
                                 || bec.ProjectInstanceId == BuildEventContext.InvalidProjectInstanceId);
            if (becIsInvalid)
                return false;

            if (errorLevel == ErrorLevel.Message)
            {
                var messageEventArgs = (BuildMessageEventArgs)eventArgs;
                bool isUserMessage = (messageEventArgs.Importance == MessageImportance.High && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Minimal))
                                    || (messageEventArgs.Importance == MessageImportance.Normal && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Normal))
                                    || (messageEventArgs.Importance == MessageImportance.Low && loggerSender.IsVerbosityAtLeast(LoggerVerbosity.Detailed));

                if (!isUserMessage)
                    return false;
            }

            return true;
        }
コード例 #8
0
        private void RegisterLogger()
        {
            _buildLogger = null;

            // Same Verbosity as in the Error List.
            const LoggerVerbosity LoggerVerbosity = LoggerVerbosity.Quiet;
            RegisterLoggerResult result = BuildOutputLogger.Register(_parsingErrorsLoggerId, LoggerVerbosity, out _buildLogger);

            if (result == RegisterLoggerResult.RegisterSuccess)
            {
                var eventSource = _buildLogger.EventSource;
                eventSource.MessageRaised += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Message);
                eventSource.WarningRaised += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Warning);
                eventSource.ErrorRaised += (s, e) => EventSource_ErrorRaised(_buildLogger, e, ErrorLevel.Error);
            }
            else if (result == RegisterLoggerResult.AlreadyExists)
            {
                if (_buildLogger.Projects != null)
                    _buildLogger.Projects.Clear();
            }
        }