首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SafeHandle的约束与抽象类

使用SafeHandle的约束与抽象类
EN

Stack Overflow用户
提问于 2015-09-24 00:36:43
回答 1查看 140关注 0票数 3

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

代码语言:javascript
复制
internal static int GetInt32Property<T>(T algorithm, string property) where T : SafeHandle

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

代码语言:javascript
复制
[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方法:

代码语言:javascript
复制
internal static int GetInt32Property(SafeHandle algorithm, string property)

使用以下本机方法:

代码语言:javascript
复制
[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的GetInt32Property总是SafeBCryptAlgorithmHandleSafeBCryptHashHandle)。

我只是想知道为什么微软这么复杂地实现了这一点。

是否与下列事项有关:

  • 安全-透明密码?
  • 类型安全?(这样您就不会使用这两种类型以外的任何其他类型)
  • 是否允许显式使用SafeHandle?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-26 22:00:01

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32751585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档