约束与使用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)
.)typeof(T) == typeof(SafeBCryptHashHandle)
类型检查不是在运行时进行的,而是在JIT时进行的。这意味着该方法应该比常规的运行时检查(如algorith is SafeBCrypthHashHandle
)执行得稍微快一些。SafeHandle
是一个抽象类。这意味着您不能创建它的实例,但可以继承它。本机函数只获取封送数据,它们不获取对对象的实际引用。不要担心引用计数