/// <summary> /// Writes the logging packet to the translator. /// </summary> internal void WriteToStream(INodePacketTranslator translator) { #if FEATURE_BINARY_SERIALIZATION if (_eventType != LoggingEventType.CustomEvent) { MethodInfo methodInfo = null; lock (s_writeMethodCache) { if (!s_writeMethodCache.TryGetValue(_eventType, out methodInfo)) { Type eventDerivedType = _buildEvent.GetType(); methodInfo = eventDerivedType.GetMethod("WriteToStream", BindingFlags.NonPublic | BindingFlags.Instance); s_writeMethodCache.Add(_eventType, methodInfo); } } int packetVersion = s_defaultPacketVersion; // Make sure the other side knows what sort of serialization is coming translator.Translate(ref packetVersion); bool eventCanSerializeItself = methodInfo != null; translator.Translate(ref eventCanSerializeItself); if (eventCanSerializeItself) { // 3.5 or later -- we have custom serialization methods, so let's use them. ArgsWriterDelegate writerMethod = (ArgsWriterDelegate)CreateDelegateRobust(typeof(ArgsWriterDelegate), _buildEvent, methodInfo); writerMethod(translator.Writer); if (_eventType == LoggingEventType.TargetFinishedEvent && _targetFinishedTranslator != null) { _targetFinishedTranslator(translator, (TargetFinishedEventArgs)_buildEvent); } } else { WriteEventToStream(_buildEvent, _eventType, translator); } } else { #if FEATURE_ASSEMBLY_LOCATION string assemblyLocation = _buildEvent.GetType().GetTypeInfo().Assembly.Location; translator.Translate(ref assemblyLocation); #else string assemblyName = _buildEvent.GetType().GetTypeInfo().Assembly.FullName; translator.Translate(ref assemblyName); #endif translator.TranslateDotNet(ref _buildEvent); } #else translator.TranslateBuildEventArgs(ref _buildEvent); #endif }
/// <summary> /// Reads the logging packet from the translator. /// </summary> internal void ReadFromStream(INodePacketTranslator translator) { #if FEATURE_BINARY_SERIALIZATION 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 } } #else translator.TranslateBuildEventArgs(ref _buildEvent); #endif _eventType = GetLoggingEventId(_buildEvent); }