如何导入void ** c++ API到c#

本文关键字:c++ API void 何导入 导入 | 更新日期: 2023-09-27 18:19:04

c++中API声明是

BOOL DCAMAPI dcam_attachbuffer          ( HDCAM h, void** top, _DWORD size );

参数:Void ** top——指向缓冲区的指针数组_DWORD size——是顶部参数的大小(以字节为单位)

在c#中,我是这样导入dll文件的:

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer",
          CallingConvention = CallingConvention.StdCall,
          CharSet = CharSet.Ansi, BestFitMapping = false,
          ThrowOnUnmappableChar = true)]
        [return: MarshalAsAttribute(UnmanagedType.Bool)]
   public static extern bool dcam_attachbuffer(IntPtr handleCamera,
 [MarshalAsAttribute(UnmanagedType.LPArray)]ref Int32[] buf, 
[MarshalAsAttribute(UnmanagedType.U4)] Int32 bufsize);

我的问题是我转换类型从c++到c#正确吗?如何在c#中声明void** ?

如何导入void ** c++ API到c#

这取决于dcam_attachbuffer的功能。

如果使用buffer,定义方法

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer"]
public static extern bool dcam_attachbuffer(
    IntPtr handleCamera,
    IntPtr ptrsBuf, 
    Int32 bufSize);

和传递先前派生的指针

如果函数正在获取指针的指针,定义方法

[DllImport("dcamapi.dll", EntryPoint = "dcam_attachbuffer"]
public static extern bool dcam_attachbuffer(
    IntPtr handleCamera,
    ref IntPtr ptrsBuf, 
    Int32 bufSize);

和使用

System.Runtime.InteropServices.Marshal.Copy(
    IntPtr source,
    IntPtr[] destination,
    int startIndex,
    int length
)

复制IntPtr[]中的指针

你可以直接在c#的不安全块中声明指针。

还有IntPtr

或者您可以编写一些c++/CLI将两者粘合在一起

参数是IntPtr[](没有ref)。删除不必要的属性后:

[DllImport("dcamapi.dll")]
public static extern bool dcam_attachbuffer(IntPtr handleCamera, 
    IntPtr[] buf, int bufsize);

正确初始化数组也可能是一个挑战,从问题中可以看出需要什么。