C# 在64位Linux上使用mono调用pcsLite

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

我有一个.Net控制台应用程序,它使用winscard/pcsclite与智能卡通信。 它在Windows和32位Linux上工作正常,但在64位Linux上失败。 SCardTransmit函数返回0,但RecvLength未更新,也未接收任何数据

更新:

问题似乎出在对SCardTransmit函数的调用中。 Dllimport是这样指定的。 我还尝试将recvLen指定为IntPtr,结果相同

[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成员。