// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** This file exists to contain miscellaneous module-level attributes ** and other miscellaneous stuff. ** ** ** ===========================================================*/ using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Collections.Generic; using System.Reflection; using System.Security; using System.StubHelpers; using System.Threading.Tasks; #if FEATURE_COMINTEROP using System.Runtime.InteropServices.WindowsRuntime; [assembly:Guid("BED7F4EA-1A96-11d2-8F08-00A0C9A6186D")] // The following attribute are required to ensure COM compatibility. [assembly:System.Runtime.InteropServices.ComCompatibleVersion(1, 0, 3300, 0)] [assembly:System.Runtime.InteropServices.TypeLibVersion(2, 4)] #endif // FEATURE_COMINTEROP [assembly:DefaultDependencyAttribute(LoadHint.Always)] // mscorlib would like to have its literal strings frozen if possible [assembly: System.Runtime.CompilerServices.StringFreezingAttribute()] namespace System { static class Internal { // This method is purely an aid for NGen to statically deduce which // instantiations to save in the ngen image. // Otherwise, the JIT-compiler gets used, which is bad for working-set. // Note that IBC can provide this information too. // However, this helps in keeping the JIT-compiler out even for // test scenarios which do not use IBC. // This can be removed after V2, when we implement other schemes // of keeping the JIT-compiler out for generic instantiations. static void CommonlyUsedGenericInstantiations() { // Make absolutely sure we include some of the most common // instantiations here in mscorlib's ngen image. // Note that reference type instantiations are already included // automatically for us. System.Array.Sort<double>(null); System.Array.Sort<int>(null); System.Array.Sort<IntPtr>(null); new ArraySegment<byte>(new byte[1], 0, 0); new Dictionary<Char, Object>(); new Dictionary<Guid, Byte>(); new Dictionary<Guid, Object>(); new Dictionary<Guid, Guid>(); // Added for Visual Studio 2010 new Dictionary<Int16, IntPtr>(); new Dictionary<Int32, Byte>(); new Dictionary<Int32, Int32>(); new Dictionary<Int32, Object>(); new Dictionary<IntPtr, Boolean>(); new Dictionary<IntPtr, Int16>(); new Dictionary<Object, Boolean>(); new Dictionary<Object, Char>(); new Dictionary<Object, Guid>(); new Dictionary<Object, Int32>(); new Dictionary<Object, Int64>(); // Added for Visual Studio 2010 new Dictionary<uint, WeakReference>(); // NCL team needs this new Dictionary<Object, UInt32>(); new Dictionary<UInt32, Object>(); new Dictionary<Int64, Object>(); #if FEATURE_CORECLR // to genereate mdil for Dictionary instantiation when key is user defined value type new Dictionary<Guid, Int32>(); #endif // Microsoft.Windows.Design new Dictionary<System.Reflection.MemberTypes, Object>(); new EnumEqualityComparer<System.Reflection.MemberTypes>(); // Microsoft.Expression.DesignModel new Dictionary<Object, KeyValuePair<Object,Object>>(); new Dictionary<KeyValuePair<Object,Object>, Object>(); NullableHelper<Boolean>(); NullableHelper<Byte>(); NullableHelper<Char>(); NullableHelper<DateTime>(); NullableHelper<Decimal>(); NullableHelper<Double>(); NullableHelper<Guid>(); NullableHelper<Int16>(); NullableHelper<Int32>(); NullableHelper<Int64>(); NullableHelper<Single>(); NullableHelper<TimeSpan>(); NullableHelper<DateTimeOffset>(); // For SQL new List<Boolean>(); new List<Byte>(); new List<Char>(); new List<DateTime>(); new List<Decimal>(); new List<Double>(); new List<Guid>(); new List<Int16>(); new List<Int32>(); new List<Int64>(); new List<TimeSpan>(); new List<SByte>(); new List<Single>(); new List<UInt16>(); new List<UInt32>(); new List<UInt64>(); new List<IntPtr>(); new List<KeyValuePair<Object, Object>>(); new List<GCHandle>(); // NCL team needs this new List<DateTimeOffset>(); new KeyValuePair<Char, UInt16>('\0', UInt16.MinValue); new KeyValuePair<UInt16, Double>(UInt16.MinValue, Double.MinValue); new KeyValuePair<Object, Int32>(String.Empty, Int32.MinValue); new KeyValuePair<Int32, Int32>(Int32.MinValue, Int32.MinValue); SZArrayHelper<Boolean>(null); SZArrayHelper<Byte>(null); SZArrayHelper<DateTime>(null); SZArrayHelper<Decimal>(null); SZArrayHelper<Double>(null); SZArrayHelper<Guid>(null); SZArrayHelper<Int16>(null); SZArrayHelper<Int32>(null); SZArrayHelper<Int64>(null); SZArrayHelper<TimeSpan>(null); SZArrayHelper<SByte>(null); SZArrayHelper<Single>(null); SZArrayHelper<UInt16>(null); SZArrayHelper<UInt32>(null); SZArrayHelper<UInt64>(null); SZArrayHelper<DateTimeOffset>(null); SZArrayHelper<CustomAttributeTypedArgument>(null); SZArrayHelper<CustomAttributeNamedArgument>(null); #if FEATURE_CORECLR #pragma warning disable 4014 // This is necessary to generate MDIL for AsyncVoidMethodBuilder AsyncHelper<int>(); AsyncHelper2<int>(); AsyncHelper3(); #pragma warning restore 4014 #endif } static T NullableHelper<T>() where T : struct { Nullable.Compare<T>(null, null); Nullable.Equals<T>(null, null); Nullable<T> nullable = new Nullable<T>(); return nullable.GetValueOrDefault(); } static void SZArrayHelper<T>(SZArrayHelper oSZArrayHelper) { // Instantiate common methods for IList implementation on Array oSZArrayHelper.get_Count<T>(); oSZArrayHelper.get_Item<T>(0); oSZArrayHelper.GetEnumerator<T>(); } #if FEATURE_CORECLR // System.Runtime.CompilerServices.AsyncVoidMethodBuilder // System.Runtime.CompilerServices.TaskAwaiter static async void AsyncHelper<T>() { await Task.Delay(1); } // System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[System.__Canon] // System.Runtime.CompilerServices.TaskAwaiter'[System.__Canon] static async Task<String> AsyncHelper2<T>() { return await Task.FromResult<string>(""); } // System.Runtime.CompilerServices.AsyncTaskMethodBuilder // System.Runtime.CompilerServices.AsyncTaskMethodBuilder'1[VoidTaskResult] static async Task AsyncHelper3() { await Task.FromResult<string>(""); } #endif #if FEATURE_COMINTEROP // Similar to CommonlyUsedGenericInstantiations but for instantiations of marshaling stubs used // for WinRT redirected interfaces. Note that we do care about reference types here as well because, // say, IList<string> and IList<object> cannot share marshaling stubs. // The methods below "call" most commonly used stub methods on redirected interfaces and take arguments // typed as matching instantiations of mscorlib copies of WinRT interfaces (IIterable<T>, IVector<T>, // IMap<K, V>, ...) which is necessary to generate all required IL stubs. [SecurityCritical] static void CommonlyUsedWinRTRedirectedInterfaceStubs() { WinRT_IEnumerable<byte>(null, null, null); WinRT_IEnumerable<char>(null, null, null); WinRT_IEnumerable<short>(null, null, null); WinRT_IEnumerable<ushort>(null, null, null); WinRT_IEnumerable<int>(null, null, null); WinRT_IEnumerable<uint>(null, null, null); WinRT_IEnumerable<long>(null, null, null); WinRT_IEnumerable<ulong>(null, null, null); WinRT_IEnumerable<float>(null, null, null); WinRT_IEnumerable<double>(null, null, null); // The underlying WinRT types for shared instantiations have to be referenced explicitly. // They are not guaranteeed to be created indirectly because of generic code sharing. WinRT_IEnumerable<string>(null, null, null); typeof(IIterable<string>).ToString(); typeof(IIterator<string>).ToString(); WinRT_IEnumerable<object>(null, null, null); typeof(IIterable<object>).ToString(); typeof(IIterator<object>).ToString(); WinRT_IList<int>(null, null, null, null); WinRT_IList<string>(null, null, null, null); typeof(IVector<string>).ToString(); WinRT_IList<object>(null, null, null, null); typeof(IVector<object>).ToString(); WinRT_IReadOnlyList<int>(null, null, null); WinRT_IReadOnlyList<string>(null, null, null); typeof(IVectorView<string>).ToString(); WinRT_IReadOnlyList<object>(null, null, null); typeof(IVectorView<object>).ToString(); WinRT_IDictionary<string, int>(null, null, null, null); typeof(IMap<string, int>).ToString(); WinRT_IDictionary<string, string>(null, null, null, null); typeof(IMap<string, string>).ToString(); WinRT_IDictionary<string, object>(null, null, null, null); typeof(IMap<string, object>).ToString(); WinRT_IDictionary<object, object>(null, null, null, null); typeof(IMap<object, object>).ToString(); WinRT_IReadOnlyDictionary<string, int>(null, null, null, null); typeof(IMapView<string, int>).ToString(); WinRT_IReadOnlyDictionary<string, string>(null, null, null, null); typeof(IMapView<string, string>).ToString(); WinRT_IReadOnlyDictionary<string, object>(null, null, null, null); typeof(IMapView<string, object>).ToString(); WinRT_IReadOnlyDictionary<object, object>(null, null, null, null); typeof(IMapView<object, object>).ToString(); WinRT_Nullable<bool>(); WinRT_Nullable<byte>(); WinRT_Nullable<int>(); WinRT_Nullable<uint>(); WinRT_Nullable<long>(); WinRT_Nullable<ulong>(); WinRT_Nullable<float>(); WinRT_Nullable<double>(); } [SecurityCritical] static void WinRT_IEnumerable<T>(IterableToEnumerableAdapter iterableToEnumerableAdapter, EnumerableToIterableAdapter enumerableToIterableAdapter, IIterable<T> iterable) { // instantiate stubs for the one method on IEnumerable<T> and the one method on IIterable<T> iterableToEnumerableAdapter.GetEnumerator_Stub<T>(); enumerableToIterableAdapter.First_Stub<T>(); } [SecurityCritical] static void WinRT_IList<T>(VectorToListAdapter vectorToListAdapter, VectorToCollectionAdapter vectorToCollectionAdapter, ListToVectorAdapter listToVectorAdapter, IVector<T> vector) { WinRT_IEnumerable<T>(null, null, null); // instantiate stubs for commonly used methods on IList<T> and ICollection<T> vectorToListAdapter.Indexer_Get<T>(0); vectorToListAdapter.Indexer_Set<T>(0, default(T)); vectorToListAdapter.Insert<T>(0, default(T)); vectorToListAdapter.RemoveAt<T>(0); vectorToCollectionAdapter.Count<T>(); vectorToCollectionAdapter.Add<T>(default(T)); vectorToCollectionAdapter.Clear<T>(); // instantiate stubs for commonly used methods on IVector<T> listToVectorAdapter.GetAt<T>(0); listToVectorAdapter.Size<T>(); listToVectorAdapter.SetAt<T>(0, default(T)); listToVectorAdapter.InsertAt<T>(0, default(T)); listToVectorAdapter.RemoveAt<T>(0); listToVectorAdapter.Append<T>(default(T)); listToVectorAdapter.RemoveAtEnd<T>(); listToVectorAdapter.Clear<T>(); } [SecurityCritical] static void WinRT_IReadOnlyCollection<T>(VectorViewToReadOnlyCollectionAdapter vectorViewToReadOnlyCollectionAdapter) { WinRT_IEnumerable<T>(null, null, null); // instantiate stubs for commonly used methods on IReadOnlyCollection<T> vectorViewToReadOnlyCollectionAdapter.Count<T>(); } [SecurityCritical] static void WinRT_IReadOnlyList<T>(IVectorViewToIReadOnlyListAdapter vectorToListAdapter, IReadOnlyListToIVectorViewAdapter listToVectorAdapter, IVectorView<T> vectorView) { WinRT_IEnumerable<T>(null, null, null); WinRT_IReadOnlyCollection<T>(null); // instantiate stubs for commonly used methods on IReadOnlyList<T> vectorToListAdapter.Indexer_Get<T>(0); // instantiate stubs for commonly used methods on IVectorView<T> listToVectorAdapter.GetAt<T>(0); listToVectorAdapter.Size<T>(); } [SecurityCritical] static void WinRT_IDictionary<K, V>(MapToDictionaryAdapter mapToDictionaryAdapter, MapToCollectionAdapter mapToCollectionAdapter, DictionaryToMapAdapter dictionaryToMapAdapter, IMap<K, V> map) { WinRT_IEnumerable<KeyValuePair<K, V>>(null, null, null); // instantiate stubs for commonly used methods on IDictionary<K, V> and ICollection<KeyValuePair<K, V>> V dummy; mapToDictionaryAdapter.Indexer_Get<K, V>(default(K)); mapToDictionaryAdapter.Indexer_Set<K, V>(default(K), default(V)); mapToDictionaryAdapter.ContainsKey<K, V>(default(K)); mapToDictionaryAdapter.Add<K, V>(default(K), default(V)); mapToDictionaryAdapter.Remove<K, V>(default(K)); mapToDictionaryAdapter.TryGetValue<K, V>(default(K), out dummy); mapToCollectionAdapter.Count<K, V>(); mapToCollectionAdapter.Add<K, V>(new KeyValuePair<K, V>(default(K), default(V))); mapToCollectionAdapter.Clear<K, V>(); // instantiate stubs for commonly used methods on IMap<K, V> dictionaryToMapAdapter.Lookup<K, V>(default(K)); dictionaryToMapAdapter.Size<K, V>(); dictionaryToMapAdapter.HasKey<K, V>(default(K)); dictionaryToMapAdapter.Insert<K, V>(default(K), default(V)); dictionaryToMapAdapter.Remove<K, V>(default(K)); dictionaryToMapAdapter.Clear<K, V>(); } [SecurityCritical] static void WinRT_IReadOnlyDictionary<K, V>(IMapViewToIReadOnlyDictionaryAdapter mapToDictionaryAdapter, IReadOnlyDictionaryToIMapViewAdapter dictionaryToMapAdapter, IMapView<K, V> mapView, MapViewToReadOnlyCollectionAdapter mapViewToReadOnlyCollectionAdapter) { WinRT_IEnumerable<KeyValuePair<K, V>>(null, null, null); WinRT_IReadOnlyCollection<KeyValuePair<K, V>>(null); // instantiate stubs for commonly used methods on IReadOnlyDictionary<K, V> V dummy; mapToDictionaryAdapter.Indexer_Get<K, V>(default(K)); mapToDictionaryAdapter.ContainsKey<K, V>(default(K)); mapToDictionaryAdapter.TryGetValue<K, V>(default(K), out dummy); // instantiate stubs for commonly used methods in IReadOnlyCollection<T> mapViewToReadOnlyCollectionAdapter.Count<K, V>(); // instantiate stubs for commonly used methods on IMapView<K, V> dictionaryToMapAdapter.Lookup<K, V>(default(K)); dictionaryToMapAdapter.Size<K, V>(); dictionaryToMapAdapter.HasKey<K, V>(default(K)); } [SecurityCritical] static void WinRT_Nullable<T>() where T : struct { Nullable<T> nullable = new Nullable<T>(); NullableMarshaler.ConvertToNative(ref nullable); NullableMarshaler.ConvertToManagedRetVoid(IntPtr.Zero, ref nullable); } #endif // FEATURE_COMINTEROP } }