У меня есть проект C++ CLR с управляемым и неуправляемым кодом. В этом проекте я просматриваю список криптопровайдеров и ищу подходящий.CryptAcquireContextA терпит неудачу в C++ CLR для «Поставщика криптографии Aloaha»
Поэтому я использую функцию
CryptEnumProvidersA
CryptAcquireContextA
У меня есть C# проекта, который использует проект C++. Когда я вызываю метод циклически перебирать список криптопровайдеров дважды, мое приложение падает. И он падает на CryptAcquireContextA. И только на «Aloaha Cryptographic Provider».
Когда я использую режим отладки, он также выходит из строя. Но когда я использую режим отладки, задаю точку останова и передаю код с помощью F10, он отлично работает.
Когда я выполняю код на C++ для разделения проекта, он отлично работает во всех случаях.
Итак, у меня есть два вопроса:
1) Как такая авария возможна? И почему это происходит?
2) Как я могу вызвать CryptAcquireContextA для обработки такого сбоя?
Мои соображения.
1) Некоторые проблемы с памятью. Я искал утечки памяти, но я не нашел.
2) Я попытался использовать try-catch, но без результата CryptAcquireContextA все равно сработает. Я хотел бы использовать функцию типа «CryptIsValidProvider» или «CryptPingProvider», но я ее не нашел.
Я положил «Сон» после того, как поставщик найден, и код работает нормально. Похоже, это действительно состояние гонки. Теперь, есть ли более элегантное решение справиться с этим? Я использую 'CryptReleaseContext' после 'CryptAcquireContextA'. Но похоже, что «CryptReleaseContext» не освобождает дескриптор или что-то еще сразу, поэтому «CryptAcquireContextA» терпит неудачу при следующем вызове. – Stanislav
Вы можете пожаловаться разработчику этого CSP, но даже если они обратят внимание, вам, скорее всего, придется отправить вызов «Сон», если вы не сможете гарантировать, что все ваши пользователи будут иметь последнюю исправленную версию. Не забудьте оставить подробный комментарий, почему существует вызов 'Sleep', поэтому кто-то не удаляет его во время обслуживания. –
Я обнаружил, что в случае «поставщика криптографии Aloaha» 'CryptAcquireContextA' возвращает NULL-дескриптор криптопровайдеру. Поэтому мое решение - вызвать «Сон», если дескриптор NULL. Благодарю. – Stanislav