我正在尝试从C#调用C ++方法。不幸的是,C ++库的文档非常简短,但是我可以访问定义方法的头文件。
C ++声明为:
DWORD FAR PASCAL EXPORT Init(int numOfChannels,int startLead,int smpRate,double* pMV_in_1_NUM,int mode = 0);
不幸的是,文档仅提供了使用此方法的C ++示例,即:
Init (8, 1, 500, &pMV_in_1_NUM, 1);
但是我试图从C#调用它,所以我的代码是:
[DllImport("NVECGUSB.dll", EntryPoint = "Init")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern UInt32 Init(
int numOfChannels,
int startLead,
int smpRate,
[param: MarshalAs(UnmanagedType.R8)]
ref double pMV_in_1_NUM,
int mode
);
然后...
double pmvIn1Num = 0;
resultCode = Init(8, 1, 500, ref pmvIn1Num, 1);
Console.WriteLine("Init returned {0}", resultCode.ToString("x"));
它不会崩溃或发生任何事情,但是resultCode
表示参数不正确,即使根据文档它们的值正确,所以我猜我的方式有问题传递该double *
参数。 (我愿意接受我在那儿错了,但现在我无法想到发生该错误的另一个原因)
请注意,我也尝试过
[DllImport("NVECGUSB.dll", EntryPoint = "Init")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern UInt32 Init(
int numOfChannels,
int startLead,
int smpRate,
double[] pMV_in_1_NUM,
int mode
);
和
double[] pmvIn1Num = new double[] { 0 };
resultCode = Init(6, 1, 250, pmvIn1Num, 1);
因为Google搜索会抛出有关double数组的结果,但是我不确定这是否适用于我的情况。
所以我的问题是,我做得正确吗?
(请注意,这与Norav 1200M ECG设备有关,因此,如果有人使用该设备工作并且可以告诉我我做错了,那也很好)