2014-09-01 145 views
1

我在C#应用程序中使用cryptoki。我的问题如下: 我使用以下代码初始化的Cryptoki:Cryptoki dll导致应用程序崩溃

public static bool InitializeCryptoki(string criptokilib) 
{ 
    if (cryptoki != null) 
     throw new PdfSignException(PdfSignExceptionCode.PDF_EXCEPTION_NOT_FINALIZED); 
    try 
    { 
     cryptoki = new Cryptoki(criptokilib); 
     if (cryptoki.Initialize() == 0) 
     { 
      isInitialized = true; 
      return true; 
     } 
     return false; 
    } 
    catch (CryptokiException ex) 
    { 
     Log.Log(log, LogState.ERROR, UserId, "Initialize", null, ex.Message); 
     return false; 
    } 
} 

criptokilib值等于“eTPKCS11.dll”。

的Cryptoki初始化后,我检查是否存在至少一个卡读取器使用以下代码:

public static bool HasCardReaders 
{ 
    get 
    { 
     if (cryptoki == null) 
      throw new PdfSignException(PdfSignExceptionCode.PDF_EXCEPTION_NOT_INITIALIZED); 
     return cryptoki.Slots.Count != 0; 
    } 
} 
  • 当从编译器(VS 2012)运行在调试模式下的应用程序,错误显示消息(没有应用程序崩溃),表示没有检测到读卡器。
  • 在编译器外部运行应用程序时(VS 2012) - 通过双击调试文件夹中的exe,我的应用程序崩溃。查看日志文件,有时候应用会在初始化cryptoki时崩溃,有时候应用会在检查是否存在至少一个读卡器时崩溃。

在调试模式下,我发现cryptoki.Slots [I] .Token抛出错误ñ。 224 - 这个错误意味着没有令牌存在。这个错误会导致我的应用崩溃吗?你有什么想法如何克服这个问题?

非常感谢你, GICA G.

回答

0

看来升级到最后一个NCryptoki.dll可以解决问题。

但是,我仍然不明白为什么这个错误导致我的应用程序崩溃。

0
if (cryptoki != null) 

这看起来是错误的。这应该是:

if (cryptoki == null) 
+0

我需要确定,如果在之前使用过cryptoki,那么会话已最终确定,所以cryptoki必须为空。 – GicaGG 2014-09-01 08:15:09

+0

如果* always *'null',为什么首先将它作为参数传递?特别是因为你传递了它。 – nvoigt 2014-09-01 08:30:56

+0

@nvoigt看起来这个方法是打算在他的类的对象引用上调用,这意味着类中的cryptoki变量可以在方法被调用时实例化,但不应该是。 – IllusiveBrian 2014-09-01 08:34:33