casmcard 包装器

Posted

技术标签:

【中文标题】casmcard 包装器【英文标题】:casmcard wrapper 【发布时间】:2012-05-21 17:20:37 【问题描述】:

我有一个智能卡和一个用 C++ (casmcard.dll) 编写的简单 sdk。

我需要通过托管代码(C#)专门调用上述dll中的一些方法来读写一些特定的块或扇区。

找不到 casmcard.dll 包装器。

有什么想法吗?

【问题讨论】:

【参考方案1】:

听起来您需要深入研究互操作性。如果它是 COM 对象,您可以导入它并让 .net 为您创建包装器。如果是老派的 dll 函数,那么你只需要导入它们。

互操作有点像魔法,所以您需要在地图和编组类型上四处搜索。

编辑

所以你的函数看起来像?

CasCLGetSN( IN SCARDHANDLE hCard, OUT LPBYTE pbCSNBuffer, IN DWORD cbCSNBufferSize, OUT LPDWORD pcbCSNLength )

试试这个:

CasCLGetSN(ScardHandle hCard, out IntPtr pbCSNBuffer, UInt32 cbCSNBufferSize, out UInt32 pcbCSNLength)

然后您需要使用重载的Marshal.Copy() 来获取 pbCSNBuffer 的内容。还要检查 scardHandle 的定义是什么。如果它是一个结构,则声明它并为其添加 Sequential 属性。

【讨论】:

这是一个原生 dll,所以我不能简单地通过引用它来自动实现包装器,但是我用 PInvoke Signature Toolkit 创建了一个简单的包装器。我的困难是执行一些块的读/写操作。本机 dll(以及我的包装器)公开了一些函数,例如 casMifarereadBlock() 和类似函数,但它们总是出错。我想我传递了一些错误的参数,所以我会尝试使用其他包装器,以查看更多示例。 可能是参数类型不太对。 .net 具有帮助您将值从本机托管类型编组为非托管类型的方法。您只需要使用 Google 和 MSDN 文档来确保正确映射类型。 没有太多关于 CasMifareReadBlock 等的文档。我迷路了。我只能执行 Transimt 方法(它将发送一个 Adpu 命令)但我无法决定查询哪个块。 您对所调用的方法有任何描述吗?查看它所期望的类型并将它们与托管类型匹配,或者如果您需要数组或字符串之类的东西,则将它们编组。 当然,看看这里的一些方法: CasCLGetSN( IN SCARDHANDLE hCard, OUT LPBYTE pbCSNBuffer, IN DWORD cbCSNBufferSize, OUT LPDWORD pcbCSNLength );

以上是关于casmcard 包装器的主要内容,如果未能解决你的问题,请参考以下文章

C++11——— 包装器

属性包装器到属性包装器

Swift | 属性包装器

将 ActiveX 包装到拦截调用(ActiveX 代理包装器)

对象的 C# 包装器

Swift 属性包装器可以引用其包装的属性所有者吗?