Tag[]数组类型的参数怎么转换成IntPtr

qq_46130698 2021-04-02 08:07:15
NX的二次开发,麻烦大佬帮忙看看怎么修改吧。最近整着东西急得头大。
Args[] grip_arg_list = new Args[1];
Tag[] obj = new Tag[2];
grip_arg_list[0].type = UFConstants.UF_TYPE_TAG_T_ARRAY;
grip_arg_list[0].length = 2;
GCHandle IndicesHandle = GCHandle.Alloc(obj, GCHandleType.Pinned);//为指定对象分配指定类型的句柄
IntPtr s = IndicesHandle.AddrOfPinnedObject();
grip_arg_list[0].address = s;
IndicesHandle.Free();

调试出现报错:

124行是这个:
GCHandle IndicesHandle = GCHandle.Alloc(obj, GCHandleType.Pinned);


这怎么修改呢?
...全文
235 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_46130698 2021-04-03
  • 打赏
  • 举报
回复
现在在unsafe{}下用指针直接转换成IntPtr了,可是做相应的计算操作后,需要读取指针指向的内容,这怎么找到数组中各元素的位置呢?就比如:
//Ptr转换成Tag[]数据
Tag[] obj= new Tag[2];
IntPtr pt = grip_arg_list[0].address;
unsafe
            {
                
                byte* BytePtr = (byte*)pt.ToPointer();//BytePtr指针指向的是pt数据空间的起始位置
                int TagLength = sizeof(Tag);   //.Length;
                obj[0] = *(Tag*)BytePtr;
                BytePtr += TagLength;
                obj[1] = *(Tag*)BytePtr;
            }
这个方法好像只有obj[0]是正确的,obj[1]的不正确,这个寻址应该怎么修改呢?
兔子-顾问 2021-04-02
  • 打赏
  • 举报
回复
应该不需要用Alloc,试试直接创建对象,转换为指针调用试试。
兔子-顾问 2021-04-02
  • 打赏
  • 举报
回复
Marshal.StructureToPtr 这个也只是转换单个对象,要不你试试
qq_46130698 2021-04-02
  • 打赏
  • 举报
回复
引用 1 楼 兔子党逍遥 的回复:
应该不需要用Alloc,试试直接创建对象,转换为指针调用试试。
还有个问题想请教一下您,就是我需要怎么将转换成IntPtr之后经过向相应的计算后又转换回Tag[],或者说读取IntPtr指向的内容?
qq_46130698 2021-04-02
  • 打赏
  • 举报
回复
引用 1 楼 兔子党逍遥 的回复:
应该不需要用Alloc,试试直接创建对象,转换为指针调用试试。
您是说直接强制转换吗?grip_arg_list[2].address = (IntPtr)obj;这样的吗?Tag[]无法转换成IntPtr

110,552

社区成员

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

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

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