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使用函数指针/委托指向正确的本机函数。我的问题是,为什么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总是
SafeBCryptoAlgorithmHandle
或
SafeBCryptHashHandle
).
我只是想知道为什么微软实现了这一相对复杂的功能。
是否必须与:
-
安全透明代码?
-
类型安全?(因此,除了这两种类型之外,您永远不会使用其他类型)
-
是否允许显式使用SafeHandle?
根据
documentation
类必须是继承的,但当给定SafeHandle的抽象类时,P/Invoked函数是否正确处理它?它是否适当地增加和减少参考计数?