如何正确声明非托管DLL函数?

时间:2017-04-26 14:00:15

标签: c# function pinvoke declaration unmanaged

我正在尝试在我的C#应用​​程序中调用非托管DLL的函数。函数声明为this。该函数写入来自采集板的数据(即,来自数组 real_data imag_data )。

我正在使用以下声明,但该文件包含不正确的数据,我认为声明是错误的:

[DllImport(@"C:\SpinCore\SpinAPI\lib32\spinapi.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int pb_write_ascii_verbose(string fname, int num_points, float SW, float SF, ref int[] real_data, ref int[] imag_data);

用法:

pb_write_ascii_verbose(@"C:\Users\Public\direct_data_0.txt", numberOfPoints, (float)actualSW, (float)sequence.Frequency, ref idata, ref idata_imag);

这是否正确宣布?如果是,那么适当的声明是什么?

2 个答案:

答案 0 :(得分:0)

您需要向Interop提供一个提示,将数组编组为LPArray。在这种情况下,ref不是必需的:

[DllImport(@"C:\SpinCore\SpinAPI\lib32\spinapi.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int pb_write_ascii_verbose(
    string fname, 
    int num_points, 
    float SW, 
    float SF, 
    [MarshalAs(UnmanagedType.LPArray)]
    int[] real_data, 
    [MarshalAs(UnmanagedType.LPArray)]
    int[] imag_data);

答案 1 :(得分:-1)

您不需要ref int[],而是宣布“指向数组的指针”。

你的DLL函数需要一个数组。

[DllImport(@"C:\SpinCore\SpinAPI\lib32\spinapi.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int pb_write_ascii_verbose(string fname, int num_points, float SW, float SF, int[] real_data, int[] imag_data);