C# 在64位Linux上使用mono调用pcsLite
我有一个.Net控制台应用程序,它使用winscard/pcsclite与智能卡通信。 它在Windows和32位Linux上工作正常,但在64位Linux上失败。 SCardTransmit函数返回0,但RecvLength未更新,也未接收任何数据 更新: 问题似乎出在对SCardTransmit函数的调用中。 Dllimport是这样指定的。 我还尝试将recvLen指定为IntPtr,结果相同C# 在64位Linux上使用mono调用pcsLite,c#,.net,linux,mono,C#,.net,Linux,Mono,我有一个.Net控制台应用程序,它使用winscard/pcsclite与智能卡通信。 它在Windows和32位Linux上工作正常,但在64位Linux上失败。 SCardTransmit函数返回0,但RecvLength未更新,也未接收任何数据 更新: 问题似乎出在对SCardTransmit函数的调用中。 Dllimport是这样指定的。 我还尝试将recvLen指定为IntPtr,结果相同 [StructLayout(LayoutKind.Sequential)] internal s
[StructLayout(LayoutKind.Sequential)]
internal struct SCardIoRequest
{
internal SCardIoRequest(CardProtocol protocol)
{
Protocol = (uint)protocol;
Length = (uint)Marshal.SizeOf(typeof(SCardIoRequest));
}
public uint Protocol;
public uint Length;
}
[DllImport("Winscard.dll", SetLastError = true)]
private static extern int SCardTransmit(IntPtr card, [In] ref SCardIoRequest sendPci, byte[] sendBuffer, uint sendLen, IntPtr recvPci, [Out] byte[] recvBuffer, ref int recvLen);
其他信息和日志:
mono version 2.10.8
pcsc-lite version 1.4.4
[centos@localhost ~]$ mono pcsctest.exe
Test PC/CS
SCardEstablishContext - returned 0
SCardListReaders - returned 0
SCardListReaders - returned 0
After GetReaders
Reader: OmniKey CardMan 6121 00 00
SCardConnect - returned 0
Connect to Card, protocol: 2
SCardTransmit - returned 0
recvlen = 256
Serial: 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
SCardTransmit - returned 0
winscard_msg_srv.c:217:SHMProcessEventsServer() Common channel packet arrival
winscard_msg_srv.c:226:SHMProcessEventsServer() SHMProcessCommonChannelRequest detects: 7
pcscdaemon.c:174:SVCServiceRunLoop() A new context thread creation is requested: 7
winscard_svc.c:131:ContextThread() Thread is started: 7
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:179:ContextThread() Client is protocol version 2:2
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard.c:242:SCardEstablishContext() Establishing Context: 16985718
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard.c:298:SCardConnect() Attempting Connect to OmniKey CardMan 6121 00 00 using protocol: 2
prothandler.c:130:PHSetProtocol() Attempting PTS to T=1
ifdhandler.c:488:IFDHSetProtocolParameters() lun: 0, protocol T=1
winscard.c:433:SCardConnect() Active Protocol: T=1
winscard.c:443:SCardConnect() hCard Identity: eaf1
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard_svc.c:730:MSGCheckHandleAssociation() Client failed to authenticate
winscard_msg_srv.c:288:SHMProcessEventsContext() correctly processed client: 7
winscard.c:253:SCardReleaseContext() Releasing Context: 16985718
winscard.c:848:SCardDisconnect() Active Contexts: 1
winscard_msg_srv.c:276:SHMProcessEventsContext() Client has disappeared: 7
winscard_svc.c:144:ContextThread() Client die: 7
mono版本2.10.8
pcsc lite版本1.4.4
[centos@localhost~]$mono pcsctest.exe
测试PC/CS
ScardestStablishContext-返回0
SCardListReaders-返回0
SCardListReaders-返回0
在GetReaders之后
读者:万能卡德曼6121 00
SCardConnect-返回0
连接到卡,协议:2
SCardTransmit-返回0
recvlen=256
序列号:00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
SCardTransmit-返回0
winscard_msg_srv.c:217:SHMProcessEventsServer()公共通道数据包到达
winscard_msg_srv.c:226:SHMProcessEventsServer()SHMProcessCommonChannelRequest检测到:7
pcscdaemon.c:174:SVCServiceRunLoop()请求创建新的上下文线程:7
winscard_svc.c:131:ContextThread()线程已启动:7
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:179:ContextThread()客户端是协议版本2:2
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard.c:242:SCardEstablishContext()建立上下文:16985718
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard.c:298:SCardConnect()正在尝试使用协议2连接到OmniKey CardMan 6121 00
prothandler.c:130:PHSetProtocol()正在尝试将PTS转换为T=1
ifdhandler.c:488:IFDHSetProtocolParameters()lun:0,协议T=1
winscard.c:433:SCardConnect()活动协议:T=1
winscard.c:443:SCardConnect()hCard标识:eaf1
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:730:MSGCheckHandleAssociation()客户端未能进行身份验证
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:730:MSGCheckHandleAssociation()客户端未能进行身份验证
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:730:MSGCheckHandleAssociation()客户端未能进行身份验证
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:730:MSGCheckHandleAssociation()客户端未能进行身份验证
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard_svc.c:730:MSGCheckHandleAssociation()客户端未能进行身份验证
winscard_msg_srv.c:288:SHMProcessEventsContext()已正确处理客户端:7
winscard.c:253:SCardReleaseContext()发布上下文:16985718
winscard.c:848:SCardDisconnect()活动上下文:1
winscard_msg_srv.c:276:SHMProcessEventsContext()客户端已消失:7
winscard_svc.c:144:ContextThread()客户端死亡:7
您没有发布代码,所以这只是一个猜测,但问题似乎出在您的互操作代码中,该代码指定了如何在托管-C#内存和非托管-C-内存之间封送数据。在开发多平台Pkcs11Interop项目的过程中,您很可能会遇到我遇到的问题 PCSC API使用C“long”类型,这非常难以封送,因为.NET中没有与所有平台上的大小匹配的类型。问题在于,在某些平台(Win32、Win64和Unix32)上,C“long”类型的长度可能为4字节,而在其他平台(Unix64)上,C“long”类型的长度可能为8字节。在.NET中,存在长度为4字节的“int”类型,不考虑平台;存在长度为8字节的“long”类型,不考虑平台。它们都不能用作C“long”类型的多平台替代方案,唯一的解决方案是使用和封送两组不同的函数和结构,一组使用“int”。NET类型用于C“long”类型为4字节长的平台,另一组使用“long”。NET类型用于C“long”类型为8字节长的平台
总而言之:您应该修复封送处理代码,或者应该使用管理更好的PCSC互操作库,该库还支持C“long”类型为8字节长的平台。看起来可能是一种方法,但我还没有测试过。好的,谢谢您的输入!我用调用代码更新了我的问题。@DanielPersson仅更改recvLen参数的类型肯定是不够的。您需要更改互操作代码中所有受影响部分的类型。当特别谈到SCardTransmit方法时,至少需要更改sendLen参数。同样的道理也适用于SCardIoRequest成员。