我按照以下方式设置了pkcs11Interop库
Pkcs11Library = PkcsFactories.Pkcs11LibraryFactory.LoadPkcs11Library(PkcsFactories, pkcs11LibraryPath, AppType.MultiThreaded)然后我立即使用WPF DispatcherTimer,其中包含WaitForSlotEvent。
Private Sub CardInsertedTimer_Tick(sender As Object, e As EventArgs)
Dim eventHappened As Boolean
Dim id As ULong
Pkcs11Library.WaitForSlotEvent(WaitType.NonBlocking, eventHappened, id)
If eventHappened Then
Debug.Print("CardInsertedEvent - Event - Event: " + eventHappened.ToString + " ID: " + id.ToString)
End If
End Sub我希望这里不会有什么意外。如果删除插槽(这是一个USB智能卡读取器),那么我将得到一个C_WaitForSlotEvent返回的CKR_DEVICE_ERROR。
发布于 2021-02-23 14:25:44
>是WaitForSlotEvent?的DispatcherTimer吗?
总体来说应该没问题。您还可以考虑在从单独线程调用的阻塞模式中使用WaitForSlotEvent。
>我该怎么办才能避免C_WaitForSlotEvent CKR_DEVICE_ERROR?
您需要询问非托管PKCS#11库的供应商。
AFAIK C_WaitForSlotEvent是为令牌/卡相关事件而设计的,而不是用于与时隙/读取器相关的事件。PKCS#11规范指出,当您添加或删除插槽/读取器时,可能需要重新加载PKCS#11库,甚至重新启动OS:
在某些平台上,或者在更早的PKCS11兼容库中,可能需要成功地调用
C_Initialize或重新启动整个系统。
> pkcs11Interop是否处理插槽的添加和删除(即。( SmartCard阅读器)?
Pkcs11Interop只允许您访问PKCS#11规范中描述的非托管函数C_WaitForSlotEvent。
>如果pkcs11Interop不处理添加和删除插槽是轮询的唯一方法,那么最好的轮询方式是什么?
见第一个问题的答案。
https://stackoverflow.com/questions/66333956
复制相似问题