2014-09-01 2 views
1

Я использую криптоки в приложении C#. У меня проблема заключается в следующем: я инициализировать 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.Slots [я] .Token кидает ошибки п. 224 - эта ошибка означает, что маркер отсутствует. Может ли эта ошибка привести к сбою моего приложения? Вы не знаете, как преодолеть эту проблему?

Большое спасибо, Gică Г.

ответ

0

Похоже, что обновление до последнего файла NCryptoki.dll решает проблему.

Однако я до сих пор не понял, почему эта ошибка вызвала мое приложение.

0
if (cryptoki != null) 

Это выглядит неправильно. Это следует читать:

if (cryptoki == null) 
+0

Мне нужно быть уверенным, что если криптоки использовался раньше, этот сеанс был завершен, поэтому криптоки должны быть пустыми. – GicaGG

+0

Если это всегда * 'null', зачем передавать его в качестве параметра в первую очередь? Тем более, что вы его передаете. – nvoigt

+0

@nvoigt Похоже, что метод предназначен для вызова ссылки на объект его класса, что означает, что переменная 'cryptoki' в классе может быть создана уже при вызове метода, но не должна быть. – IllusiveBrian

Смежные вопросы