【问题标题】:DLLImport Int** - How to do this if it can be doneDLLImport Int** - 如果可以的话怎么做
【发布时间】:2008-10-16 16:11:56
【问题描述】:

我正在尝试使用第三方 DLL,该 DLL 需要一个 int** 作为该方法的参数之一。它将参数描述为指向内存分配的指针的地址。

如有任何混淆,我们深表歉意。我认为参数是双向的。 DLL 用于与 FPGA 板通信,方法是在主机 PC 和 PCI 板之间建立 DMA 传输。

【问题讨论】:

    标签: c# interop pinvoke dllimport


    【解决方案1】:

    使用 by-ref System.IntPtr

     [DllImport("thirdparty.dll")]
     static extern long ThirdPartyFunction(ref IntPtr arg);
    
     long f(int[] array)
      { long retval = 0;
        int  size   = Marshal.SizeOf(typeof(int));
        var  ptr    = IntPtr.Zero;
    
        try 
         { ptr = Marshal.AllocHGlobal(size * array.Length);
    
           for (int i= 0; i < array.Length; ++i) 
            { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
              Marshal.StructureToPtr(array, tmpPtr, false);
            }
    
           retval = ThirdPartyFunction(ref ptr);
         }
        finally 
         { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
         }
    
        return retval;
      }
    

    【讨论】:

    • 如何将 int[] 转换为 IntPtr?
    • 使用 ref IntPtr 似乎正在编译和运行。在我知道它完全正常工作之前,我还有一点路要走。
    【解决方案2】:

    在这种情况下,您将不得不使用 Marshal 类或变得不安全。

    它也可能只是一个指向数组的指针,所以 ref int[] list 可能会起作用。

    【讨论】:

    • 这是我会记住的,以防其他方式不起作用。
    • 如果您将数据传递给函数,这可能是最简单的。
    【解决方案3】:

    一个 int** 将是 IntPtr 的数组,根据您的描述,我认为您可能想研究使用 C++/CLI 来帮助您进行转换,例如从非托管 int** 到托管数组^>^

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2012-04-08
      • 2021-06-30
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多