在 .Net Standard 2.0 中有哪些43个API不在 .Net Framework 4.6.1 中?

21

这个SO问题.NET标准API参考提到了一个讨论https://github.com/dotnet/standard/issues/133,其中提到了43个API将被包含在.Net Standard 2.0中,但不受.Net Framework 4.6.1支持。然而,我在互联网上没有找到这43个API的列表。在我的搜索中最接近的是https://github.com/dotnet/standard/blob/master/docs/versions/netstandard1.5_diff.mdhttps://github.com/dotnet/standard/blob/master/docs/versions/netstandard1.6_diff.md,它们列出了在.Net Standard 1.5和1.6中引入的API。起初我以为我的搜索已经结束了,但后来我意识到:

  1. 这两个列表中包含的API数量远远超过43个,
  2. 其中许多API已经被.Net Framework 4.6.1支持。

在互联网上是否有一个清单列出了在.Net Standard 2.0中包含但不包含在.Net Framework 4.6.1中的43个具体API?


Ben Adams 在 GitHub 的问题反馈中最后一条评论中提供了一个链接,其中列出了 52 个未在版本 4.6.1 中实现的 API,这难道不是你正在寻找的吗? - Sami Kuhmonen
你是指这个列表吗?看起来非常有用,谢谢!不过,我一直在浏览http://apisof.net/来尝试回答自己的问题,发现了一些未列出的API。 (例如,System.Reflection.TypeInfo中的几个新API不在4.6.1中,但未出现在Ben Adams链接的列表中)。 所以我会继续编写我目前正在写的答案,然后查看它与Ben Adams列表的重叠部分。 - rmunn
2个回答

12
通过使用 https://apisof.net 并将其与列在 https://github.com/dotnet/standard/blob/master/docs/versions/netstandard1.5_diff.mdhttps://github.com/dotnet/standard/blob/master/docs/versions/netstandard1.6_diff.md 中的每个 API 进行比较,我已经成功地制作了一个列表,其中包含在 .Net Standard 1.6 中但在 .Net Framework 4.6.1 中缺失的 API:
  • System.Diagnostics.Tracing.EventCounter
    • public EventCounter(string name, EventSource eventSource)(不在 .Net Framework 中)
    • public void WriteMetric(float value)(不在 .Net Framework 中)
  • System.Diagnostics.Tracing.EventSource
    • public event EventHandler<EventCommandEventArgs> EventCommandExecuted(在 .Net Framework 4.6.2 中存在,但不存在于 4.6.1 中)
  • System.IO.BufferedStream
    • public int BufferSize { get; }(不在 .Net Framework 中)
    • public Stream UnderlyingStream { get; }(不在 .Net Framework 中)
  • System.Reflection.TypeInfo:以下所有 API 都不在 .Net Framework 中

    public virtual bool IsCOMObject { get; }
    public override MemberTypes MemberType { get; }
    public virtual StructLayoutAttribute StructLayoutAttribute { get; }
    public ConstructorInfo TypeInitializer { get; }
    public virtual Type UnderlyingSystemType { get; }
    public virtual Type[] FindInterfaces(TypeFilter filter, object filterCriteria);
    public virtual MemberInfo[] FindMembers(MemberTypes memberType, BindingFlags bindingAttr, MemberFilter filter, object filterCriteria);
    public ConstructorInfo GetConstructor(Type[] types);
    public ConstructorInfo[] GetConstructors();
    public virtual ConstructorInfo[] GetConstructors(BindingFlags bindingAttr);
    public virtual MemberInfo[] GetDefaultMembers();
    public virtual string GetEnumName(object value);
    public virtual string[] GetEnumNames();
    public virtual Type GetEnumUnderlyingType();
    public virtual Array GetEnumValues();
    public EventInfo GetEvent(string name);
    public virtual EventInfo GetEvent(string name, BindingFlags bindingAttr);
    public virtual EventInfo[] GetEvents();
    public virtual EventInfo[] GetEvents(BindingFlags bindingAttr);
    public FieldInfo GetField(string name);
    public virtual FieldInfo GetField(string name, BindingFlags bindingAttr);
    public FieldInfo[] GetFields();
    public virtual FieldInfo[] GetFields(BindingFlags bindingAttr);
    public virtual Type[] GetGenericArguments();
    public Type GetInterface(string name);
    public virtual Type GetInterface(string name, bool ignoreCase);
    public virtual Type[] GetInterfaces();
    public MemberInfo[] GetMember(string name);
    public virtual MemberInfo[] GetMember(string name, BindingFlags bindingAttr);
    public virtual MemberInfo[] GetMember(string name, MemberTypes type, BindingFlags bindingAttr);
    public MemberInfo[] GetMembers();
    public virtual MemberInfo[] GetMembers(BindingFlags bindingAttr);
    public MethodInfo GetMethod(string name);
    public MethodInfo GetMethod(string name, BindingFlags bindingAttr);
    public MethodInfo GetMethod(string name, Type[] types);
    public MethodInfo GetMethod(string name, Type[] types, ParameterModifier[] modifiers);
    public MethodInfo[] GetMethods();
    public virtual MethodInfo[] GetMethods(BindingFlags bindingAttr);
    public Type GetNestedType(string name);
    public virtual Type GetNestedType(string name, BindingFlags bindingAttr);
    public Type[] GetNestedTypes();
    public virtual Type[] GetNestedTypes(BindingFlags bindingAttr);
    public PropertyInfo[] GetProperties();
    public virtual PropertyInfo[] GetProperties(BindingFlags bindingAttr);
    public PropertyInfo GetProperty(string name);
    public PropertyInfo GetProperty(string name, BindingFlags bindingAttr);
    public PropertyInfo GetProperty(string name, Type returnType);
    public PropertyInfo GetProperty(string name, Type returnType, Type[] types);
    public PropertyInfo GetProperty(string name, Type returnType, Type[] types, ParameterModifier[] modifiers);
    public PropertyInfo GetProperty(string name, Type[] types);
    public virtual bool IsAssignableFrom(Type c);
    public virtual bool IsEnumDefined(object value);
    public virtual bool IsEquivalentTo(Type other);
    public virtual bool IsInstanceOfType(object o);
    
  • System.AppContext
    • public static string TargetFrameworkName { get; }(不在 .Net Framework 中)
    • public static object GetData(string name)(不在 .Net Framework 中)
  • System.Linq.Enumerable
    • public static IEnumerable<TSource> Append<TSource>(this IEnumerable<TSource> source, TSource element)(不在 .Net Framework 中)
    • public static IEnumerable<TSource> Prepend<TSource>(this IEnumerable<TSource> source, TSource element)(不在 .Net Framework 中)
  • System.Security.Cryptography.ECCurve:整个 ECCurve 结构体及其包含的所有内容(包括 System.Security.Cryptography.ECCurve.NamedCurves 静态类)均不在 .Net Framework 中。换句话说,以下列表中的所有 API 都是 .Net Core 中新增的,在 .Net Framework 4.6.1(或 4.6.2)中找不到:

  • public struct ECCurve {
        public enum ECCurveType {
            Characteristic2 = 4,
            Implicit = 0,
            Named = 5,
            PrimeMontgomery = 3,
            PrimeShortWeierstrass = 1,
            PrimeTwistedEdwards = 2,
        }
        public static class NamedCurves {
            public static ECCurve brainpoolP160r1 { get; }
            public static ECCurve brainpoolP160t1 { get; }
            public static ECCurve brainpoolP192r1 { get; }
            public static ECCurve brainpoolP192t1 { get; }
            public static ECCurve brainpoolP224r1 { get; }
            public static ECCurve brainpoolP224t1 { get; }
            public static ECCurve brainpoolP256r1 { get; }
            public static ECCurve brainpoolP256t1 { get; }
            public static ECCurve brainpoolP320r1 { get; }
            public static ECCurve brainpoolP320t1 { get; }
            public static ECCurve brainpoolP384r1 { get; }
            public static ECCurve brainpoolP384t1 { get; }
            public static ECCurve brainpoolP512r1 { get; }
            public static ECCurve brainpoolP512t1 { get; }
            public static ECCurve nistP256 { get; }
            public static ECCurve nistP384 { get; }
            public static ECCurve nistP521 { get; }
        }
        public byte[] A;
        public byte[] B;
        public byte[] Cofactor;
        public ECCurve.ECCurveType CurveType;
        public ECPoint G;
        public Nullable<HashAlgorithmName> Hash;
        public byte[] Order;
        public byte[] Polynomial;
        public byte[] Prime;
        public byte[] Seed;
        public bool IsCharacteristic2 { get; }
        public bool IsExplicit { get; }
        public bool IsNamed { get; }
        public bool IsPrime { get; }
        public Oid Oid { get; }
        public static ECCurve CreateFromFriendlyName(string oidFriendlyName);
        public static ECCurve CreateFromOid(Oid curveOid);
        public static ECCurve CreateFromValue(string oidValue);
        public void Validate();
    }
    
  • System.Security.Cryptography.ECParameters结构体:不在 .Net Framework 中
  • System.Security.Cryptography.ECPoint 结构体:不在 .Net Framework 中
  • System.Security.Cryptography.ECDsa
    • public static ECDsa Create(ECCurve curve) (不在 .Net Framework 中)
    • public static ECDsa Create(ECParameters parameters)(不在 .Net Framework 中)
    • public virtual ECParameters ExportExplicitParameters(bool includePrivateParameters)(不在 .Net Framework 中)
    • public virtual ECParameters ExportParameters(bool includePrivateParameters)(不在 .Net Framework 中)
    • public virtual void GenerateKey(ECCurve curve)(不在 .Net Framework 中)
    • public virtual void ImportParameters(ECParameters parameters)(不在 .Net Framework 中)
  • System.Text.RegularExpressions.Regex
    • protected IDictionary CapNames { get; set; }(不在 .Net Framework 中)
    • protected IDictionary Caps { get; set; }(不在 .Net Framework 中)

这比 43 个 API 还多。我还没有浏览 .Net Standard 2.0 API 列表(它非常庞大),一旦我完成,我将编辑此答案以反映我的发现。


SignedCms和CmsSigner来自密码学pkcs。 - VMAtm
4
问题涉及的是.NET Standard 2.0,而不是1.6。我之前看到开发人员的注释,建议不要依赖于1.5和1.6,因为这两个版本与2.0不兼容。 - Hans Passant
是的,我知道我问过 .Net Standard 2.0 的问题。到目前为止,我只有时间研究 1.5 和 1.6 中的更改;2.0 中的更改将需要我花费更长的时间来回答自己的问题。这就是为什么我希望有人能够指向一个已经存在的清单。 - rmunn

4

我在.Net Standard项目中发布了一个类似的问题

所有的功劳归功于@benaadams

你可以在ApiCompatBaseline.net461.txt中找到缺失的API。

我检查了文件,发现有52个条目(超过43个!)。

这52个缺失的API是:

     Member 'System.AppContext.GetData(System.String)' 
     Member 'System.AppContext.TargetFrameworkName.get()' 
     Type 'System.StringNormalizationExtensions' 
     Type 'System.Data.Common.DbColumn' 
     Type 'System.Data.Common.DbDataReaderExtensions' 
     Type 'System.Data.Common.IDbColumnSchemaGenerator' 
     Type 'System.Diagnostics.StackFrameExtensions' 
     Type 'System.Diagnostics.Tracing.EventCounter' 
     Member 'System.Diagnostics.Tracing.EventSource.add_EventCommandExecuted(System.EventHandler<System.Diagnostics.Tracing.EventCommandEventArgs>)' 
     Member 'System.Diagnostics.Tracing.EventSource.remove_EventCommandExecuted(System.EventHandler<System.Diagnostics.Tracing.EventCommandEventArgs>)' 
     Type 'System.Globalization.GlobalizationExtensions' 
     Member 'System.Linq.Enumerable.Append<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource)' 
     Member 'System.Linq.Enumerable.Prepend<TSource>(System.Collections.Generic.IEnumerable<TSource>, TSource)' 
     Member 'System.Linq.Expressions.Expression<TDelegate>.Compile(System.Boolean)' 
     Member 'System.Linq.Expressions.LambdaExpression.Compile(System.Boolean)' 
     Member 'System.Net.Http.HttpClientHandler.CheckCertificateRevocationList.get()' 
     Member 'System.Net.Http.HttpClientHandler.CheckCertificateRevocationList.set(System.Boolean)' 
     Member 'System.Net.Http.HttpClientHandler.ClientCertificates.get()' 
     Member 'System.Net.Http.HttpClientHandler.DefaultProxyCredentials.get()' 
     Member 'System.Net.Http.HttpClientHandler.DefaultProxyCredentials.set(System.Net.ICredentials)' 
     Member 'System.Net.Http.HttpClientHandler.MaxConnectionsPerServer.get()' 
     Member 'System.Net.Http.HttpClientHandler.MaxConnectionsPerServer.set(System.Int32)' 
     Member 'System.Net.Http.HttpClientHandler.MaxResponseHeadersLength.get()' 
     Member 'System.Net.Http.HttpClientHandler.MaxResponseHeadersLength.set(System.Int32)' 
     Member 'System.Net.Http.HttpClientHandler.Properties.get()' 
     Member 'System.Net.Http.HttpClientHandler.ServerCertificateCustomValidationCallback.get()' 
     Member 'System.Net.Http.HttpClientHandler.ServerCertificateCustomValidationCallback.set(System.Func<System.Net.Http.HttpRequestMessage, System.Security.Cryptography.X509Certificates.X509Certificate2, System.Security.Cryptography.X509Certificates.X509Chain, System.Net.Security.SslPolicyErrors, System.Boolean>)' 
     Member 'System.Net.Http.HttpClientHandler.SslProtocols.get()' 
     Member 'System.Net.Http.HttpClientHandler.SslProtocols.set(System.Security.Authentication.SslProtocols)' 
     Type 'System.Net.Sockets.SocketReceiveFromResult' 
     Type 'System.Net.Sockets.SocketReceiveMessageFromResult' 
     Type 'System.Net.Sockets.SocketTaskExtensions' 
     Type 'System.Runtime.Serialization.DataContractSerializerExtensions' 
     Type 'System.Runtime.Serialization.ISerializationSurrogateProvider' 
     Type 'System.Security.SecureStringMarshal' 
     Type 'System.Security.Cryptography.ECCurve' 
     Member 'System.Security.Cryptography.ECDsa.Create(System.Security.Cryptography.ECCurve)' 
     Member 'System.Security.Cryptography.ECDsa.Create(System.Security.Cryptography.ECParameters)' 
     Member 'System.Security.Cryptography.ECDsa.ExportExplicitParameters(System.Boolean)' 
     Member 'System.Security.Cryptography.ECDsa.ExportParameters(System.Boolean)' 
     Member 'System.Security.Cryptography.ECDsa.GenerateKey(System.Security.Cryptography.ECCurve)' 
     Member 'System.Security.Cryptography.ECDsa.ImportParameters(System.Security.Cryptography.ECParameters)' 
     Type 'System.Security.Cryptography.ECParameters' 
     Type 'System.Security.Cryptography.ECPoint' 
     Type 'System.Security.Cryptography.IncrementalHash' 
     Member 'System.Text.RegularExpressions.Regex.CapNames.get()' 
     Member 'System.Text.RegularExpressions.Regex.CapNames.set(System.Collections.IDictionary)' 
     Member 'System.Text.RegularExpressions.Regex.Caps.get()' 
     Member 'System.Text.RegularExpressions.Regex.Caps.set(System.Collections.IDictionary)' 
     Type 'System.Threading.PreAllocatedOverlapped' 
     Type 'System.Threading.ThreadPoolBoundHandle' 
     Type 'System.Xml.XPath.XDocumentExtensions' 

我检查了大部分这些API,发现它们在net461中不可用,但在netstandard2中可用。


2017年11月更新:

随着.NET Framework 4.7.1的最终发布,所有在4.6.1中缺失的API都已被实现。

已实现API列表

现在,.Net Standard 2.0已经内置于.NET Framework 4.7.1中,无需安装.Net Standard 2.0支持的二进制文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接