调用从C#用C ++编写DLL中的自定义类型
-
18-09-2019 - |
题
我使用的是用C ++写在我的C#项目的DLL。我已经能够调用使用该代码的DLL内的功能:
[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr VmHidScan();
现在我需要调用该requres自定义类型的指针的函数。所述文档为DLL布局这样的功能:
hid_get_info(int n,PDEV_INFO *pdi)
我不知道如何使用这个自定义指针。这是在DLL中定义?如果是的话如何从C#项目中使用它?如果不这样做,我需要包括在C#中的头文件?在此先感谢您的帮助。
解决方案
鉴于“P”的前缀,它看起来像真正的声明是
hid_get_info(int n, DEV_INFO **pdi)
其中的dev_info是一种结构。你需要找到这个结构的声明,并将其与[StructLayout]属性添加到您的C#代码。然后你会宣布这样的功能在你的C#代码:
[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);
和使用Marshal.PtrToStructure(),以获得结构值。希望你没有自由的结构,你会搞砸了。
一个第二的解释是,“PID”返回指针的dev_info结构的阵列。有点可能给出的“N”的说法,这很可能意味着数组中传递给由该函数填充元素的数量。在这种情况下,通过一个IntPtr [],并设置“n”的其长度。
其他提示
您需要创建在C#struct
,反映在C ++中的C ++ PDEV_INFO
struct
。
您应适用[StructLayout(LayoutKind.Sequential)]
的struct,然后复制从C ++结构中的字段的顺序(看头文件)。
可以再写入一个extern
方法,是以struct
作为ref
参数。
我会安全地假定PDEV_INFO*
是DEV_INFO**
。
在C#使用此:
class DEV_INFO
{
// fields go here
}
static class NativeMethods
{
[DllImport...]
public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
不隶属于 StackOverflow