The class is a container of different system tools, which are used across the framework. Some of these tools are platform specific, so their implementation is different on different platform, like .NET and Mono.
/// <summary> /// Gets the underlying buffer position for a StreamReader. /// </summary> /// /// <param name="reader">A StreamReader whose position will be retrieved.</param> /// /// <returns>The current offset from the beginning of the /// file that the StreamReader is currently located into.</returns> /// public static long GetPosition(this StreamReader reader) { // http://stackoverflow.com/a/17457085/262032 #if NETSTANDARD1_4 || NETSTANDARD2_0 var type = typeof(StreamReader).GetTypeInfo(); char[] charBuffer = (char[])type.GetDeclaredField("_charBuffer").GetValue(reader); int charPos = (int)type.GetDeclaredField("_charPos").GetValue(reader); int byteLen = (int)type.GetDeclaredField("_byteLen").GetValue(reader); #else var type = typeof(StreamReader); char[] charBuffer; int charPos; int byteLen; if (SystemTools.IsRunningOnMono() && type.GetField("decoded_buffer") != null) { // Mono's StreamReader source code is at: https://searchcode.com/codesearch/view/26576619/ // The current buffer of decoded characters charBuffer = (char[])GetField(reader, "decoded_buffer"); // The current position in the buffer of decoded characters charPos = (int)GetField(reader, "decoded_count"); // The number of encoded bytes that are in the current buffer byteLen = (int)GetField(reader, "buffer_size"); } else { // The current buffer of decoded characters charBuffer = (char[])GetField(reader, "charBuffer"); // The current position in the buffer of decoded characters charPos = (int)GetField(reader, "charPos"); // The number of encoded bytes that are in the current buffer byteLen = (int)GetField(reader, "byteLen"); } #endif // The number of bytes that the already-read characters need when encoded. int numReadBytes = reader.CurrentEncoding.GetByteCount(charBuffer, 0, charPos); return(reader.BaseStream.Position - byteLen + numReadBytes); }
/// <summary> /// Populates the dictionary with available decoders of a particular category by /// inspecting types from all referenced assemblies. Note: calling this method /// will force all referenced assemblies to be loaded into the current AppDomain. /// </summary> /// /// <typeparam name="T">The base type for the decoders. This should be an interface such as IImageDecoder or IAudioDecoder.</typeparam> /// /// <param name="dictionary">The dictionary where the found decoders will be stored.</param> /// <param name="extension">The extension we are interested in.</param> /// public static void PopulateDictionaryWithDecodersFromAllAssemblies <T>(Dictionary <string, Type> dictionary, string extension) { lock (dictionary) { extension = extension.ToUpperInvariant(); if (dictionary.ContainsKey(extension)) { return; } var decoderTypes = new List <Tuple <Type, FormatDecoderAttribute[]> >(); #if NETSTANDARD1_4 TypeInfo baseType = typeof(T).GetTypeInfo(); foreach (Type t in baseType.Assembly.ExportedTypes) { TypeInfo ti = t.GetTypeInfo(); var attributes = ti.GetCustomAttributes(typeof(FormatDecoderAttribute), true).ToArray(); if (attributes != null && attributes.Length > 0 && baseType.IsAssignableFrom(ti)) { FormatDecoderAttribute[] at = attributes.Cast <FormatDecoderAttribute>().ToArray(); decoderTypes.Add(Tuple.Create(t, at)); } } #else Type baseType = typeof(T); if (SystemTools.IsRunningOnMono()) { Console.WriteLine("FormatDecoderAttribute: Running on Mono ({0})", typeof(T)); foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) { foreach (Type t in a.GetTypes()) { var attributes = t.GetCustomAttributes(typeof(FormatDecoderAttribute), true); if (attributes != null && attributes.Length > 0 && baseType.IsAssignableFrom(t)) { FormatDecoderAttribute[] at = attributes.Cast <FormatDecoderAttribute>().ToArray(); decoderTypes.Add(Tuple.Create(t, at)); } } } Console.WriteLine("FormatDecoderAttribute: Found {0} {1} decoders.", decoderTypes.Count, typeof(T)); } else { foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) { foreach (AssemblyName referencedName in a.GetReferencedAssemblies()) { Assembly referencedAssembly = Assembly.Load(referencedName); foreach (Type t in referencedAssembly.GetTypes()) { var attributes = t.GetCustomAttributes(typeof(FormatDecoderAttribute), true); if (attributes != null && attributes.Length > 0 && baseType.IsAssignableFrom(t)) { FormatDecoderAttribute[] at = attributes.Cast <FormatDecoderAttribute>().ToArray(); decoderTypes.Add(Tuple.Create(t, at)); } } } } } #endif foreach (Tuple <Type, FormatDecoderAttribute[]> pair in decoderTypes) { foreach (FormatDecoderAttribute attr in pair.Item2) { extension = attr.Extension.ToUpperInvariant(); if (!dictionary.ContainsKey(extension)) { dictionary.Add(extension, pair.Item1); } } } } }