约束与使用SafeHandle的抽象类

本文关键字:抽象类 SafeHandle 约束 | 更新日期: 2023-09-27 18:14:10

在BCryptNative中有一个方法叫做GetInt32Property。它的签名如下:

internal static int GetInt32Property<T>(T algorithm, string property) where T : SafeHandle

此方法仅在T的类型为SafeBCryptAlgorithmHandle或SafeBCryptHashHandle时有效。它调用用句柄类型显式定义的本机方法:

[DllImport("bcrypt.dll", EntryPoint = "BCryptGetProperty", CharSet = CharSet.Unicode)]
internal static extern ErrorCode BCryptGetAlgorithmProperty(SafeBCryptAlgorithmHandle hObject,
                                                            string pszProperty,
                                                            [MarshalAs(UnmanagedType.LPArray), In, Out] byte[] pbOutput,
                                                            int cbOutput,
                                                            [In, Out] ref int pcbResult,
                                                            int flags);
[DllImport("bcrypt.dll", EntryPoint = "BCryptGetProperty", CharSet = CharSet.Unicode)]
internal static extern ErrorCode BCryptGetHashProperty(SafeBCryptHashHandle hObject,
                                                       string pszProperty,
                                                       [MarshalAs(UnmanagedType.LPArray), In, Out] byte[] pbOutput,
                                                       int cbOutput,
                                                       [In, Out] ref int pcbResult,
                                                       int flags);

Microsoft使用函数指针/委托指向正确的本机函数。我的问题是,为什么微软不使用以下签名实现GetInt32Property方法:

internal static int GetInt32Property(SafeHandle algorithm, string property)

的本地方法:

[DllImport("bcrypt.dll", CharSet = CharSet.Unicode)]
internal static extern ErrorCode BCryptGetProperty(SafeHandle hObject,
                                                   string pszProperty,
                                                   [MarshalAs(UnmanagedType.LPArray), In, Out] byte[] pbOutput,
                                                   int cbOutput,
                                                   [In, Out] ref int pcbResult,
                                                   int flags);

这有什么缺点吗?(假设传递给GetInt32Property的SafeHandle总是SafeBCryptAlgorithmHandle或SafeBCryptHashHandle)。

我只是想知道为什么微软实现这个相对复杂。

一定要和:

  • Security-Transparent代码?
  • 类型安全?(所以你永远不要使用这两种类型以外的任何类型)
  • 是否允许显式使用SafeHandle ?

根据文档类必须被继承,它是,然而,当给定一个抽象类的SafeHandle时,p/Invoked函数是否正确处理它?它是否适当地增加和减少引用计数?

约束与使用SafeHandle的抽象类

很难说为什么微软选择以这样或那样的方式实现某些东西,但我可以回答你的问题。

    代码并不复杂。用法很明确(如GetInt32Property(algorithm, str) .)
  • 它不会强迫你发送你提到的类型之一,你仍然可以用不同的类调用它,只要它实现SafeHandle
  • 使用的本机方法实际上是相同的。这有点奇怪,但我不是这个特定库的专家,所以这可能是一个很好的理由。像这样的泛型方法有一个隐藏的好处。typeof(T) == typeof(SafeBCryptHashHandle)类型检查不是在运行时进行的,而是在JIT时进行的。这意味着该方法应该比常规的运行时检查(如algorith is SafeBCrypthHashHandle)执行得稍微快一些。

SafeHandle是一个抽象类。这意味着您不能创建它的实例,但可以继承它。本机函数只获取封送数据,它们不获取对对象的实际引用。不要担心引用计数