@@ -39,7 +39,7 @@
 using Microsoft.Scripting.Runtime;
 using Microsoft.Scripting.Utils;
 
-#if WIN8 || WP75
+#if WIN8 || WP75 || NETSTANDARD
 namespace System.Runtime.CompilerServices {
     [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event)]
     public sealed class SpecialNameAttribute : Attribute {
@@ -569,7 +569,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
         #region Declared Members
 
         public static IEnumerable<ConstructorInfo> GetDeclaredConstructors(this Type type) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().DeclaredConstructors;
 #else
             return type.GetConstructors(BindingFlags.DeclaredOnly | AllMembers);
@@ -583,7 +583,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
 #endif
 
         public static IEnumerable<MethodInfo> GetDeclaredMethods(this Type type, string name = null) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             if (name == null) {
                 return type.GetTypeInfo().DeclaredMethods;
             } else {
@@ -599,7 +599,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
         }
 
         public static IEnumerable<PropertyInfo> GetDeclaredProperties(this Type type) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().DeclaredProperties;
 #else
             return type.GetProperties(BindingFlags.DeclaredOnly | AllMembers);
@@ -608,15 +608,15 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
 
         public static PropertyInfo GetDeclaredProperty(this Type type, string name) {
             Debug.Assert(name != null);
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().GetDeclaredProperty(name);
 #else
             return type.GetProperty(name, BindingFlags.DeclaredOnly | AllMembers);
 #endif
         }
 
         public static IEnumerable<EventInfo> GetDeclaredEvents(this Type type) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().DeclaredEvents;
 #else
             return type.GetEvents(BindingFlags.DeclaredOnly | AllMembers);
@@ -625,15 +625,15 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
 
         public static EventInfo GetDeclaredEvent(this Type type, string name) {
             Debug.Assert(name != null);
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().GetDeclaredEvent(name);
 #else
             return type.GetEvent(name, BindingFlags.DeclaredOnly | AllMembers);
 #endif
         }
 
         public static IEnumerable<FieldInfo> GetDeclaredFields(this Type type) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().DeclaredFields;
 #else
             return type.GetFields(BindingFlags.DeclaredOnly | AllMembers);
@@ -642,27 +642,27 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
 
         public static FieldInfo GetDeclaredField(this Type type, string name) {
             Debug.Assert(name != null);
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().GetDeclaredField(name);
 #else
             return type.GetField(name, BindingFlags.DeclaredOnly | AllMembers);
 #endif
         }
 
         public static IEnumerable<TypeInfo> GetDeclaredNestedTypes(this Type type) {
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().DeclaredNestedTypes;
 #else
-            return type.GetNestedTypes(BindingFlags.DeclaredOnly | AllMembers).Select(t => t.GetTypeInfo());
+            return type.GetNestedTypes(BindingFlags.DeclaredOnly | AllMembers);
 #endif
         }
 
         public static TypeInfo GetDeclaredNestedType(this Type type, string name) {
             Debug.Assert(name != null);
-#if WIN8
+#if FEATURE_TYPE_INFO
             return type.GetTypeInfo().GetDeclaredNestedType(name);
 #else
-            return type.GetNestedType(name, BindingFlags.DeclaredOnly | AllMembers).GetTypeInfo();
+            return type.GetNestedType(name, BindingFlags.DeclaredOnly | AllMembers);
 #endif
         }
 
@@ -776,6 +776,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
             return type.GetTypeInfo().ImplementedInterfaces;
         }
 
+#if !NETSTANDARD
         public static MethodInfo GetGetMethod(this PropertyInfo propertyInfo, bool nonPublic = false) {
             var accessor = propertyInfo.GetMethod;
             return nonPublic || accessor == null || accessor.IsPublic ? accessor : null;
@@ -814,6 +815,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
         public static MethodInfo GetMethod(this Type type, string name, BindingFlags bindingFlags) {
             return type.GetMethods(name, bindingFlags).Single();
         }
+#endif
 
         private static IEnumerable<MethodInfo> GetMethods(this Type type, string name, BindingFlags bindingFlags) {
             return type.GetTypeInfo().GetDeclaredMethods(name).WithBindingFlags(bindingFlags);
@@ -824,25 +826,29 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
             return builder.CreateTypeInfo().AsType();
         }
 
+#if !NETSTANDARD
         public static object GetRawConstantValue(this FieldInfo field) {
             return ((dynamic)field).GetRawConstantValue();
         }
 
         public static int GetMetadataToken(this MemberInfo member) {
             return ((dynamic)member).MetadataToken;
         }
+#endif
 
         public static Module GetModule(this MemberInfo member) {
             return member.Module;
         }
 
+#if !NETSTANDARD
         public static Type[] GetGenericArguments(this Type type) {
             return type.GetTypeInfo().GenericTypeArguments;
         }
 
         public static bool IsAssignableFrom(this Type type, Type other) {
             return type.GetTypeInfo().IsAssignableFrom(other.GetTypeInfo());
         }
+#endif
 
         public static Type[] GetGenericParameterConstraints(this Type type) {
             return type.GetTypeInfo().GetGenericParameterConstraints();
@@ -852,9 +858,11 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
             return type.GetTypeInfo().IsSubclassOf(other);
         }
 
+#if !NETSTANDARD
         public static IEnumerable<Type> GetInterfaces(this Type type) {
             return type.GetTypeInfo().ImplementedInterfaces;
         }
+#endif
 
         public static Type[] GetRequiredCustomModifiers(this ParameterInfo parameter) {
             return EmptyTypes;
@@ -879,6 +887,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
             return null;
         }
 
+#if !NETSTANDARD
         public static IEnumerable<MemberInfo> GetDefaultMembers(this Type type) {
             string defaultMemberName = type.GetDefaultMemberName();
             if (defaultMemberName != null) {
@@ -887,6 +896,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
 
             return Enumerable.Empty<MemberInfo>();
         }
+#endif
 #else
 
         public static IEnumerable<Module> GetModules(this Assembly assembly) {
@@ -1178,7 +1188,7 @@ private static IEnumerable<T> WithBindingFlags<T>(this IEnumerable<T> members, F
         public static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateType, object target) {
             return Delegate.CreateDelegate(delegateType, target, methodInfo);
         }
-#elif !WIN8
+#elif !WIN8 && !NETSTANDARD
         /// <summary>
         /// Creates an open delegate for the given (dynamic)method.
         /// </summary>