请教 C# 调用 C++ 的dll 问题,谢谢!
原型:intReadBaseMsg(unsignedchar*pMsg,int*len);说明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,...
原 型:int ReadBaseMsg( unsigned char *pMsg, int * len);
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。
Len [out] 整数, 返回总字符长度,可以给空值(NULL)。
请问C#中应如何调用?我写成这样是错误的(报错栈溢出):
[DllImport(@"E:\CardIDTest\lib\sdtapi.dll")]
public static extern int ReadBaseMsg(ref byte[] msg, ref int len);
private void button1_Click(object sender, EventArgs e)
{
byte[] msg = new byte[193];
int len = 0;
int n = ReadBaseMsg(ref msg, ref len);
} 展开
说 明:本函数用于读取卡中基本信息,包括文字信息与图像信息。文字信息已经分段解析,输出格式为单字节,且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp(在当前工作目录下)。
参 数:
pMsg [out] 无符号字符指针,指向读到的文本信息。需要在调用时分配内存,字节数不小于192。函数调用成功后,各字段的文本信息已经转换为单字节形式,并表示为字符串格式。
Len [out] 整数, 返回总字符长度,可以给空值(NULL)。
请问C#中应如何调用?我写成这样是错误的(报错栈溢出):
[DllImport(@"E:\CardIDTest\lib\sdtapi.dll")]
public static extern int ReadBaseMsg(ref byte[] msg, ref int len);
private void button1_Click(object sender, EventArgs e)
{
byte[] msg = new byte[193];
int len = 0;
int n = ReadBaseMsg(ref msg, ref len);
} 展开
3个回答
展开全部
[DllImport(@"E:\CardIDTest\lib\sdtapi.dll")]
public static unsafe extern int ReadBaseMsg(char* msg, ref int len);
private unsafe void button1_Click(object sender, EventArgs e)
{
char* msg = stackalloc char[1000];
int len = 0;
int n = ReadBaseMsg(msg, ref len);
String str = new String(msg);
}
使用unsafe关键字记得要在项目属性的生成中, 把"允许编译不安全代码"勾上
public static unsafe extern int ReadBaseMsg(char* msg, ref int len);
private unsafe void button1_Click(object sender, EventArgs e)
{
char* msg = stackalloc char[1000];
int len = 0;
int n = ReadBaseMsg(msg, ref len);
String str = new String(msg);
}
使用unsafe关键字记得要在项目属性的生成中, 把"允许编译不安全代码"勾上
追问
你好,首先谢谢你,考虑到稳定性,我不想用指针,可以帮忙不用指针解决吗?谢谢,我这边没有分数了,不然可以给你追加分数的,谢谢你
追答
用StringBuilder试试
public static extern int ReadBaseMsg(ref StringBuilder msg, ref int len);
var sb = new StringBuilder();
int len = 0;
int n = ReadBaseMsg(ref sb, ref len);
String str = sb.ToString();
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询