C# Cryptoki dll导致应用程序崩溃
我在C#应用程序中使用cryptoki。我的问题如下: 我使用以下代码初始化cryptoki:C# Cryptoki dll导致应用程序崩溃,c#,smartcard,C#,Smartcard,我在C#应用程序中使用cryptoki。我的问题如下: 我使用以下代码初始化cryptoki: public static bool InitializeCryptoki(string criptokilib) { if (cryptoki != null) throw new PdfSignException(PdfSignExceptionCode.PDF_EXCEPTION_NOT_FINALIZED); try { cryptoki
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;
}
}
public static bool HasCardReaders
{
get
{
if (cryptoki == null)
throw new PdfSignException(PdfSignExceptionCode.PDF_EXCEPTION_NOT_INITIALIZED);
return cryptoki.Slots.Count != 0;
}
}
criptokilib值等于“eTPKCS11.dll”。
cryptoki初始化后,我使用以下代码检查是否至少存在一个读卡器:
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;
}
}
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时崩溃,有时应用程序在检查是否至少存在一个读卡器时崩溃
if (cryptoki == null)
升级到最后一个NCryptoki.dll似乎可以解决这个问题
然而,我仍然不明白为什么这个错误会导致我的应用程序崩溃。我需要确定,如果以前使用过cryptoki,那么该会话已经完成,因此cryptoki必须为null。如果它总是
null
,为什么首先要将它作为参数传递?特别是在您传递它之后。@nvoigt它看起来像是要在他的类的对象引用上调用该方法,这意味着类中的cryptoki
变量可以在调用该方法时被实例化,但不应该被实例化。cryptoki=new cryptoki(criptokilib)代码>?您确保在此行中始终传递null
。这是一个错误,或者您应该传递null
并废弃参数。@nvoigt您搞错了。我作为参数cryptokilib传递,它与“eTPKCS11.dll”相等。我需要确保cryptoki是空的,而不是cryptokilib。