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)。
我只是想知道为什么微软实现这个相对复杂。
是否必须:
- 安全透明代码?
- 类型安全?(这样您就永远不会使用这两种类型之外的任何其他类型)
- 是否允许明确使用 SafeHandle?
根据文档,该类必须被继承,但是当给定 SafeHandle 的抽象类时,P/Invoked 函数是否正确处理它?它是否适当地增加和减少引用计数?