Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# casmcard包装器 我有一个智能卡,一个简单的SDK,用C++编写(CasMoCK.DLL)。_C#_C++_Smartcard - Fatal编程技术网

C# casmcard包装器 我有一个智能卡,一个简单的SDK,用C++编写(CasMoCK.DLL)。

C# casmcard包装器 我有一个智能卡,一个简单的SDK,用C++编写(CasMoCK.DLL)。,c#,c++,smartcard,C#,C++,Smartcard,我需要通过托管代码(C#)调用上述dll中的某个方法来读写特定的块或扇区 未找到casmcard.dll包装 有什么想法吗?听起来你需要深入研究互操作。如果它是COM对象,您可以导入它&让.net为您创建包装器。如果是老式的dll函数,那么您只需要导入它们 互操作是一门黑色艺术,所以你需要在谷歌上搜索映射和编组类型 编辑 那么你的函数看起来像 CasCLGetSN( IN SCARDHANDLE hCard, OUT LPBYTE pbCSNBuffer, IN DWORD cbCSNBuffe

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

未找到casmcard.dll包装


有什么想法吗?

听起来你需要深入研究互操作。如果它是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签名工具包创建了一个简单的包装。我的难点是执行一些块的读/写操作。本机dll(还有我的包装器)公开了一些函数,比如casMifarereadBlock()和类似的函数,但它们总是出错。我想我传递了一些错误的参数,所以我会尝试使用其他包装器,以查看更多示例。可能是参数类型不太正确。net有一些方法可以帮助您将值从本机托管类型封送到非托管类型。您只需要使用Google和MSDN文档来确保正确映射类型。关于CasMifareReadBlock等的文档不多。我迷路了。我只能执行Transimt方法(它将发送一个Adpu命令),但我无法决定查询哪个块。您对调用的方法有什么描述吗?查看它期望的类型&将它们与托管类型匹配,或者如果需要数组或字符串之类的内容,则封送它们。当然,请查看以下一些方法:CasCLGetSN(在SCARDHANDLE hCard中,OUT LPBYTE pbCSNBuffer,IN DWORD cbCSNBufferSize中,OUT LPDWORD pcbCSNLength);