3

BCryptNative 中有一个名为GetInt32Property的方法。它具有以下签名:

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

此方法仅在 T 类型为SafeBCryptAlgorithmHandleSafeBCryptHashHandle时有效。它调用使用这些类型的句柄显式定义的本机方法:

[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 始终是SafeBCryptAlgorithmHandleSafeBCryptHashHandle)。

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

是否必须:

  • 安全透明代码?
  • 类型安全?(这样您就永远不会使用这两种类型之外的任何其他类型)
  • 是否允许明确使用 SafeHandle?

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

4

1 回答 1

1

很难说微软为什么选择以一种或另一种方式实现某些东西,但我可以回答你的观点。

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

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

于 2015-09-26T22:00:01.280 回答