c# - 如何导入带有 int** 和 double** 参数的 C++ 函数

标签 c# c++ marshalling dllimport intptr

我正在尝试在我的 C# 代码中导入 C++ 函数。

该函数定义为:

int SetPointers(int* ID, int* BufferID, int** Pointer, double** Time, int NumberOfPointers);

ID 是一个 int 数组, BufferId 一个 int 数组, 指针为int数组, 对 double 组进行计时,并且 NumberOfPointers 一个整数。

我尝试使用 IntPtr 但没有成功。

这是我尝试过的最新代码:

[DllImport("open.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern int SetPointers(int* ID, int* BufferID, ref IntPtr Pointer, ref IntPtr Time, int NumberOfPointers);
public unsafe int _SetPointers(int[] ID, int[] BufferID, ref int[] Pointer, ref double[] Time, int NumberOfPointers)
{
    IntPtr fQueue = IntPtr.Zero;
    IntPtr fTime = IntPtr.Zero;
    int breturn = -1;
    fixed (int* fId = ID)
    fixed (int* fBufferID = BufferID)
    fQueue = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * Pointer.Length);
    fTime = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(double)) * Timestamp.Length);
    breturn = SetPointers(fId, fBufferID, ref fQueue, ref fTime, NumberOfPointers);
    return breturn;
}

我该怎么做?

最佳答案

首先,您可能希望使用 IntPtr 作为参数而不是 int[]。

此后,我还没有尝试过,但要在指针上编码指针,“ref IntPtr”或“out IntPtr”会起作用。

public unsafe int _SetPointers(IntPtr ID, IntPtr BufferID, ref IntPtr Pointer, ref IntPtr Time, int NumberOfPointers);

另请查看另一个问题: How do I marshall a pointer to a pointer of an array of structures?

关于c# - 如何导入带有 int** 和 double** 参数的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20221747/

相关文章:

c# - 为什么另一个应用程序窗口标题中的文本不正确?

c# - 在 C# 中使用 F# 作为 dll

c# - 读取单色位图像素颜色

c++ - C++ 模板特化中的字符串参数

C# 为 MarshalAs 属性类定义自定义 UnmanagedType

C# - 在 C# 中的等效数据类型中编码(marshal) char **

c# - C# 中的字符串复数化和本地化

c++ - 我对为 std::array 赋值的方式有一些疑问

c++ - 我的类有一个 toString() 方法,我如何使用它在 std::unordered_set 中进行散列?

java - 如何在 JAXB MARSHALLING 期间修剪字符串