You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何在通用Windows平台(UWP)用C#读取Gemalto RFID卡

在UWP中用C#读取Gemalto RFID卡的解决方案

嘿,很高兴能帮你搞定这个问题!你之前在WPF和传统Windows应用里用winscard.dll读写Gemalto RFID卡很顺畅,但到UWP这里因为沙箱机制的限制,确实需要调整实现方式。下面给你两种可行的方案,按需选择:

方案一:使用UWP原生智能卡API(推荐)

UWP提供了专门的Windows.Devices.SmartCards命名空间,完美适配沙箱环境,不需要额外的复杂配置,是首选方案。

步骤1:添加功能声明

首先在你的Package.appxmanifest里添加智能卡权限:

<Capabilities>
    <Capability Name="smartCard"/>
</Capabilities>

步骤2:枚举读卡器并监听卡片插入

通过API枚举所有可用的智能卡读卡器,然后监听卡片插入事件:

using Windows.Devices.SmartCards;
using System.Linq;

// 枚举读卡器
var readers = await SmartCardReader.GetReadersAsync();
if (!readers.Any())
{
    // 没有找到读卡器,提示用户
    return;
}

// 给每个读卡器绑定卡片插入事件
foreach (var reader in readers)
{
    reader.CardAdded += OnCardAdded;
}

步骤3:连接卡片并发送APDU指令

当卡片插入时,建立连接并发送和WPF中相同的Gemalto卡APDU指令:

private async void OnCardAdded(SmartCardReader sender, SmartCardReaderCardAddedEventArgs args)
{
    var smartCard = args.SmartCard;
    // 以共享模式连接卡片
    using (var connection = await smartCard.ConnectAsync(SmartCardShareMode.Shared))
    {
        // 示例:发送选择Gemalto应用的APDU指令(和你WPF里用的一致)
        byte[] apduCommand = new byte[] { 0x00, 0xA4, 0x04, 0x00, 0x0A, 0xA0, 0x00, 0x00, 0x00, 0x47, 0x45, 0x4D, 0x41, 0x4C, 0x54, 0x4F };
        
        // 传输指令并获取响应
        var response = await connection.TransmitAsync(apduCommand);
        
        if (response.Succeeded)
        {
            byte[] responseData = response.ResponseData;
            // 这里解析Gemalto卡返回的数据,逻辑和你WPF里的一样
        }
        else
        {
            // 处理指令执行失败的情况
        }
    }
}

方案二:继续使用winscard.dll(兼容旧代码)

如果你想复用之前WPF里的winscard.dll调用代码,也可以实现,但因为UWP沙箱的限制,需要把应用打包成桌面桥接应用(Desktop Bridge),也就是将传统桌面应用包装成UWP格式。

步骤1:添加全信任权限

在Package.appxmanifest里添加runFullTrust权限(需要先添加rescap命名空间):

<Package
    xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    IgnorableNamespaces="rescap">

    <!-- 其他配置 -->

    <Capabilities>
        <rescap:Capability Name="runFullTrust" />
    </Capabilities>
</Package>

步骤2:复用P/Invoke代码

你的WPF里的winscard.dll函数声明可以直接复用,比如:

[DllImport("winscard.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int SCardEstablishContext(uint dwScope, IntPtr pvReserved1, IntPtr pvReserved2, out IntPtr phContext);

[DllImport("winscard.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int SCardReleaseContext(IntPtr hContext);

// 其他需要的winscard函数声明...

之后的卡片读写逻辑和WPF里完全一致,因为桌面桥接应用拥有和传统桌面应用一样的权限。

注意事项

  • 如果你选择方案一,要确保你的读卡器驱动支持UWP的智能卡API,部分老旧驱动可能不兼容,这种情况下方案二是更好的选择。
  • 两种方案中,发送给Gemalto卡的APDU指令都是相同的,你可以直接复用之前WPF里的指令逻辑。

内容的提问来源于stack exchange,提问作者user2059390

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:44:39