none
UnsafeAddrOfPinnedArrayElement 问题返回指针,专递到非管理代码,随机错误。 RRS feed

  • 问题

  •       

    问题:

    二维数组,作为参数,传递给c++库(方法,将获取的数据,写入到二维数组)。单次运行没有问题。如果批量循环运行下列代码。二维数组获取的数据偶尔全为0(好像没有读到数据),但是c++中的确是获得了数据。(这个写了测试代码,的确没有问题)

    c# 中对 c Dll接口定义如下:

         [DllImport("syDriver.dll", EntryPoint = "syCmdRead", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
            public static extern int syCmdRead(byte group, byte address, IntPtr cmds, ref int cmdCount);

        将接口从IntPtr修改为byte【】,运行是正确的。

    可能是UnsafeAddrOfPinnedArrayElement使用不当,但是,按msdn说明,好像又找不到问题,请各位大师指点。谢谢!

        问题代码如下:

    cmds = new byte[count, 4];
                var cmdCount = count;
                GCHandle gh = GCHandle.Alloc(cmds);

                try
                {
                    IntPtr ptr = Marshal.UnsafeAddrOfPinnedArrayElement(cmds, 0);

                  //c++ 代码,将读取的数据放到数组ptr里面。

                    return syCmdRead(group, address, ptr,ref cmdCount);

                }
                catch
                {
                }
                finally
                {
                    gh.Free();
                }
    2017年6月26日 14:11

全部回复

  • Hi,

    感谢你在MSDN论坛发帖。

    根据你的描述,是不是这个数据被其他线程重复读取,导致数据出现的错误。 还是这个数据在读取的时候需要一些时间,你有加判断条件吗?

    从这个函数的官方解释来看,这个函数需要在完全信任的情况下,才可以用。

    SecurityCriticalAttribute

    requires full trust for the immediate caller. This member cannot be used by partially trusted or transparent code.

    这边有个使用这个函数的demo,希望对你有所帮助。

    https://www.codeproject.com/Tips/855149/Csharp-Fast-Memory-Copy-Method-with-x-Assembly-Usa

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月27日 3:02
    版主
  • 是不是和C# 的二维数组有关。(以上操作,完全在一个线程完成)。

    奇怪的是,为什么换成byte[],就没有任何问题。

    谢谢!

    2017年6月28日 9:12
  • Hi,

    我觉得应该是指针是指向一块内存,就像引用一样,内存不是那么固定,有可能出现野指针。

    但是数组就不一样了,内存已经分配好了,而且内容也是确定的。 就没有指针的那些问题。

    不知道我的想法对不对。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年6月28日 9:21
    版主