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

C# 如何正确声明非托管DLL函数?,c#,function,pinvoke,declaration,unmanaged,C#,Function,Pinvoke,Declaration,Unmanaged,我试图在我的C应用程序中调用非托管DLL的函数。函数声明是。该函数将来自采集板的数据写入文件,即来自阵列real_数据和imag_数据 我使用了以下声明,但该文件包含不正确的数据,我认为该声明是错误的: [DllImport(@"C:\SpinCore\SpinAPI\lib32\spinapi.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int pb_write_ascii_verbose(s

我试图在我的C应用程序中调用非托管DLL的函数。函数声明是。该函数将来自采集板的数据写入文件,即来自阵列real_数据和imag_数据

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

[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[],而是声明一个指向数组的指针

[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);
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);

嗯,spincore确实提供了.Net包装,但它们是测试版,不清楚它们在他们谈论的vs 2008网站上有多新!!!!,不管怎样,您可以看看这里:您知道这是什么类型的DLL,并且您在尝试调用时是否遇到错误?尝试将您的呼叫惯例更改为StdCall。@Alex Dmitry Egorov的回答有效。@niceman谢谢您的建议。谢谢!我测试了你的答案,没问题。