求助,C#调用C++动态链接库

晒月亮的幽灵 2012-03-13 11:23:39
1
...全文
173 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
WAN 2012-03-15
  • 打赏
  • 举报
回复
PtrToStringAnsi不要传入长度,之后也就不需要再Trim
WAN 2012-03-15
  • 打赏
  • 举报
回复
class Program
{
public const int tagMac_BytesCount = 64;
public const int tagCoordinate_BytesCount = 32;
public const int tagAll_BytesCount = tagMac_BytesCount + tagCoordinate_BytesCount;

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct TAG_INFO
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = tagMac_BytesCount)]
public String tagMac;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = tagCoordinate_BytesCount)]
public String tagCoordinate;
}

//定义一个与非直接复制到本机结构中的类型具有相同大小的可直接复制到本机结构中的帮助器类型
//并在平台调用函数返回后转化数据
[StructLayout(LayoutKind.Explicit)]
public struct MARSHAL_TAG_INFO
{
[FieldOffset(0)]
public Byte byteStart;
[FieldOffset(tagAll_BytesCount - 1)] //强制结构大小
public Byte byteEnd;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct RSSI_INFO
{
public Int16 nRSSI;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string strCoordinate;
}

public class LibWrap
{
[DllImport("MyDll.dll", CharSet = CharSet.Ansi)]
public static extern MARSHAL_TAG_INFO GetCoordinateByTagsRssi(String tagMac, Int16 inAPCount, [In, Out] RSSI_INFO[] pRssiInfo);
}

static void Main(string[] args)
{
TAG_INFO result;
MARSHAL_TAG_INFO resultTemp;

RSSI_INFO[] test = new RSSI_INFO[3];
test[0].nRSSI = 5;
test[1].nRSSI = 5;
test[2].nRSSI = 5;

test[0].strCoordinate = "x:0,y:5";
test[1].strCoordinate = "x:5,y:0";
test[2].strCoordinate = "x:10,y:5";

String tagmac = "AAAA";
Int16 m = 3;

resultTemp = LibWrap.GetCoordinateByTagsRssi(tagmac, m, test);

//利用非托管内存转化数据。效率不高,或有更好的方法
IntPtr pointer = Marshal.AllocCoTaskMem(tagAll_BytesCount);
Marshal.StructureToPtr(resultTemp, pointer, true);
result.tagMac = Marshal.PtrToStringAnsi(pointer, tagMac_BytesCount);
result.tagCoordinate = Marshal.PtrToStringAnsi(pointer + tagMac_BytesCount, tagCoordinate_BytesCount);
Marshal.FreeCoTaskMem(pointer);

Console.WriteLine("【{0}】,【{1}】", result.tagMac.Trim((char)0), result.tagCoordinate.Trim((char)0));
Console.ReadKey();
}
}
晒月亮的幽灵 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]

1、要用[StructLayout( LayoutKind.Sequential)]防止.net进行结构优化。
2、用RSSI_INFO[] pRssiInfo而不是ref RSSI_INFO pRssiInfo,保证在PInvoke的时候,所有的数组成员不会被CLR移动。
3、要用byte[] tagMac,不然就要指定封送方式:[MarshalAs(...)] string tagMac……
[/Quote]
回复三楼大侠
1.这条语句原本就写了
2.我去掉了ref
3.使用了byte[] tagmac
public static extern TAG_INFO GetCoordinateByTagsRssi(byte[] tagMac, Int16 inAPCount, RSSI_INFO[] pRssiInfo);
这样的声明是没有问题的吧

jieguo = GetCoordinateByTagsRssi(tagmac, m, test);//这样的调用也OK吗?

结果还是 方法的类型签名与 PInvoke 不兼容 崩溃哦
晒月亮的幽灵 2012-03-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 foreachif 的回复:]

TAG_INFO不属于可直接复制到本机结构中的类型,不能直接作为返回值
可以这样:
extern"C" _declspec(dllexport) void _stdcall GetCoordinateByTagsRssi(char tagMac[64], short inAPCount, RSSI_INFO* pRssiInfo, TAG_INFO* pResult)
public sta……
[/Quote]
这个接口是公司提供的 我只能按照接口做
而且已经在VC VB下调试通过 在这里改接口恐怕不行
WAN 2012-03-14
  • 打赏
  • 举报
回复
TAG_INFO不属于可直接复制到本机结构中的类型,不能直接作为返回值
可以这样:
extern"C" _declspec(dllexport) void _stdcall GetCoordinateByTagsRssi(char tagMac[64], short inAPCount, RSSI_INFO* pRssiInfo, TAG_INFO* pResult)
public static extern void GetCoordinateByTagsRssi(String tagMac, Int16 inAPCount, [In, Out] RSSI_INFO[] pRssiInfo, ref TAG_INFO pResult);
还有建议为每一个结构定义处加上LayoutKind和CharSet,DllImport声明处也加上CharSet,否则可能出错
晒月亮的幽灵 2012-03-14
  • 打赏
  • 举报
回复
顶一下 继续等高手
gomoku 2012-03-13
  • 打赏
  • 举报
回复
1、要用[StructLayout( LayoutKind.Sequential)]防止.net进行结构优化。
2、用RSSI_INFO[] pRssiInfo而不是ref RSSI_INFO pRssiInfo,保证在PInvoke的时候,所有的数组成员不会被CLR移动。
3、要用byte[] tagMac,不然就要指定封送方式:[MarshalAs(...)] string tagMac。
zw_l_1989 2012-03-13
  • 打赏
  • 举报
回复
http://www.cnblogs.com/warensoft/archive/2011/12/09/Warenosoft3D.html
zw_l_1989 2012-03-13
  • 打赏
  • 举报
回复
http://www.cnblogs.com/warensoft/archive/2011/12/09/Warenosoft3D.html
LOVE_GG 2012-03-13
  • 打赏
  • 举报
回复
lz需要做好c#调用c++dll时的数据类型对应。这里总结得挺好:
http://blog.csdn.net/xqf222/article/details/5877795

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧