如何定义从c / c ++到c#的DllImport声明

时间:2016-11-02 19:47:37

标签: c# struct interop pinvoke dllimport

我想在C#中为我的程序使用c库。
该库包含一个带有c函数的头文件,用于控制摄像头。

c中的一些函数使用一个名为*fg的指针 它指向一个名为Fg_Struct的typedef 最后,这个typedef被声明为Typedef struct Fg_Struct_s Fg_Struct

所以现在,我想在我的c#程序中使用头文件中的这些函数。 我创建了一个新类并从dll-libary导入了这些函数 在pinvoker-addon上 pinvoker-addon创建了这些函数的新声明 (从非管理到管理) 大多数这些新声明的函数都有一个名为的变量 Fg_Struct [] Fg

Visual Studio在C#programm中向我显示“Fg_Struct未定义”的错误。

例如,我可以使用Fg_getLastErrorDiscripstion函数来调用错误描述

C中的

fgrab_struct.h

typedef struct Fg_Struct_s Fg_Struct;

fgrab-prototyp.h

include "struct.h"
const char *const Fg_getLastErrorDescription(Fg_Struct *Fg);

的main.cpp

Fg_Struct *fg = NULL;
fg = Fg_Init(DLLNAME, boardNr)
fprintf(stderr, "error in Fg_Init: %s\n", Fg_getLastErrorDescription(NULL));

现在我想在c#中使用它:

CAM_SISO.cs

[DllImport("fglib5.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr Fg_getLastErrorDescription(Fg_Struct [] Fg);`

我是C#编程的新手,并且通过pinvoker在每个主题中进行了研究 但我找不到合适的答案,如何声明或定义Fg_Struct [] Fg以在C#中使用Fg_getLastErrorDiscription函数。

1 个答案:

答案 0 :(得分:0)

如果您的代码实际上没有真正查看Fg_Struct内部,只将其传递给DLL中的其他函数,那么您可以在C头文件具有{{1}的任何地方使用IntPtr }}

除此之外,由于C源代码使用以下任意一个指针:array,pass-by-reference参数,输出参数,自动p / invoke生成器必须猜测并且经常会产生错误的结果,例如数组他们不属于的地方。