111,129
社区成员
发帖
与我相关
我的任务
分享
,你说的对,我只想调用连接的方法和发命令的方法就行,但我看这个项目里文件一堆,所以不知道看哪些;那我先把example文件夹下的看懂吧,多谢指教
var contextFactory = ContextFactory.Instance;
using (var ctx = contextFactory.Establish(SCardScope.System)) {
using (var isoReader = new IsoReader(ctx, "ACME Smartcard reader", SCardShareMode.Shared, SCardProtocol.Any, false)) {
//上面3行不需要看,他完全遵循C++的定义,查找连接设备,至于那些参数都是C++参数,你看c++文档定义就好
//下面构造一个发送指令包
var apdu = new CommandApdu(IsoCase.Case2Short, isoReader.ActiveProtocol) {
CLA = 0x00, // Class
Instruction = InstructionCode.GetChallenge,
P1 = 0x00, // Parameter 1
P2 = 0x00, // Parameter 2
Le = 0x08 // Expected length of the returned data
};
//发送并获取结果
var response = isoReader.Transmit(apdu);
Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2);
// ..
}
}
到这种程度,你就只需要使用他就好,你不需要管他的代码注释?这样的demo要注释什么呢,这代码一目了然哦。如果你想知道他底下具体实现,我说你到不必去看,前面已经说了,他其实就是调用winscard.dll。所以他的底层流程你可以不用看,他完全遵循C++的调用流程和定义。 [DllImport(WINSCARD_DLL, CharSet = CharSet.Unicode)]
private static extern int SCardEstablishContext(
[In] int dwScope,
[In] IntPtr pvReserved1,
[In] IntPtr pvReserved2,
[In, Out] ref IntPtr phContext);
可以看到他依旧还是使用的这种方式,只是外面对其做了一下简化封装
至于使用上你先看他的demo
https://github.com/danm-de/pcsc-sharp/tree/master/Examples
ps:从他的项目上看,个人建议使用Reactive版本的提供,我个人喜欢可观测流版本(方便啊)