/// <summary> /// Reads the logging packet from the translator. /// </summary> internal void ReadFromStream(ITranslator translator) { if (LoggingEventType.CustomEvent != _eventType) { _buildEvent = GetBuildEventArgFromId(); // The other side is telling us whether the event knows how to log itself, or whether we're going to have // to do it manually int packetVersion = s_defaultPacketVersion; translator.Translate(ref packetVersion); bool eventCanSerializeItself = true; translator.Translate(ref eventCanSerializeItself); if (eventCanSerializeItself) { MethodInfo methodInfo = null; lock (s_readMethodCache) { if (!s_readMethodCache.TryGetValue(_eventType, out methodInfo)) { Type eventDerivedType = _buildEvent.GetType(); methodInfo = eventDerivedType.GetMethod("CreateFromStream", BindingFlags.NonPublic | BindingFlags.Instance); s_readMethodCache.Add(_eventType, methodInfo); } } ArgsReaderDelegate readerMethod = (ArgsReaderDelegate)CreateDelegateRobust(typeof(ArgsReaderDelegate), _buildEvent, methodInfo); readerMethod(translator.Reader, packetVersion); if (_eventType == LoggingEventType.TargetFinishedEvent && _targetFinishedTranslator != null) { _targetFinishedTranslator(translator, (TargetFinishedEventArgs)_buildEvent); } } else { _buildEvent = ReadEventFromStream(_eventType, translator); } } else { string fileLocation = null; translator.Translate(ref fileLocation); bool resolveAssembly = false; lock (s_lockObject) { if (!s_customEventsLoaded.Contains(fileLocation)) { resolveAssembly = true; } // If we are to resolve the assembly add it to the list of assemblies resolved if (resolveAssembly) { s_customEventsLoaded.Add(fileLocation); } } #if FEATURE_APPDOMAIN if (resolveAssembly) { s_resolver = new TaskEngineAssemblyResolver(); s_resolver.InstallHandler(); s_resolver.Initialize(fileLocation); } #endif try { translator.TranslateDotNet(ref _buildEvent); } finally { #if FEATURE_APPDOMAIN if (resolveAssembly) { s_resolver.RemoveHandler(); s_resolver = null; } #endif } } _eventType = GetLoggingEventId(_buildEvent); }
/// <summary> /// Reads the logging packet from the translator. /// </summary> internal void ReadFromStream(INodePacketTranslator translator) { if (LoggingEventType.CustomEvent != _eventType) { _buildEvent = GetBuildEventArgFromId(); // The other side is telling us whether the event knows how to log itself, or whether we're going to have // to do it manually int packetVersion = s_defaultPacketVersion; translator.Translate(ref packetVersion); bool eventCanSerializeItself = true; translator.Translate(ref eventCanSerializeItself); if (eventCanSerializeItself) { MethodInfo methodInfo = null; lock (s_readMethodCache) { if (!s_readMethodCache.TryGetValue(_eventType, out methodInfo)) { Type eventDerivedType = _buildEvent.GetType(); methodInfo = eventDerivedType.GetMethod("CreateFromStream", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod); s_readMethodCache.Add(_eventType, methodInfo); } } ArgsReaderDelegate readerMethod = (ArgsReaderDelegate)CreateDelegateRobust(typeof(ArgsReaderDelegate), _buildEvent, methodInfo); readerMethod(translator.Reader, packetVersion); if (_eventType == LoggingEventType.TargetFinishedEvent && _targetFinishedTranslator != null) { _targetFinishedTranslator(translator, (TargetFinishedEventArgs)_buildEvent); } } else { _buildEvent = ReadEventFromStream(_eventType, translator); } } else { string fileLocation = null; translator.Translate(ref fileLocation); bool resolveAssembly = false; lock (s_lockObject) { if (!s_customEventsLoaded.Contains(fileLocation)) { resolveAssembly = true; } // If we are to resolve the assembly add it to the list of assemblies resolved if (resolveAssembly) { s_customEventsLoaded.Add(fileLocation); } } if (resolveAssembly) { s_resolver = new TaskEngineAssemblyResolver(); s_resolver.InstallHandler(); s_resolver.Initialize(fileLocation); } try { translator.TranslateDotNet(ref _buildEvent); } finally { if (resolveAssembly) { s_resolver.RemoveHandler(); s_resolver = null; } } } _eventType = GetLoggingEventId(_buildEvent); }