如何正确声明非托管 DLL 函数?
How to correctly declare unmanaged DLL function?
我正在尝试在我的 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);
这个声明正确吗?如果是这样,正确的声明是什么?
您不需要 ref int[]
,您正在声明 "a pointer to an array"。
您的 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);
您需要提示 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);
我正在尝试在我的 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);
这个声明正确吗?如果是这样,正确的声明是什么?
您不需要 ref int[]
,您正在声明 "a pointer to an array"。
您的 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);
您需要提示 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);