How To Marshal Int Arrays Or Pointers To Int Arrays

前端 未结 2 503
礼貌的吻别
礼貌的吻别 2021-01-18 20:59

(I understand this might be duplicate but I don\'t understand the other threads)

I\'m working with C# an I have a third party dll that needs in

相关标签:
2条回答
  • 2021-01-18 21:41

    It isn't a SafeArray. A SafeArray is something connected to Variants and the good old times of OLE :-) It probably lives in the dictionary near the word "dodo".

    It is:

    [DllImport(dllName, CallingConvention=CallingConvention.StdCall)]
    static extern void ReadStuff(int id, int[] buffer);
    

    the marshaler will do the "right" thing.

    or

    [DllImport(dllName, CallingConvention=CallingConvention.StdCall)]
    static extern void ReadStuff(int id, IntPtr buffer);
    

    but then it's more complex to use.

    The CallingConvention=CallingConvention.StdCall is the default one, so it isn't necessary to write it out explicitly.

    You use this way:

    // call
    int[] array = new int[12];
    ReadStuff(1, array);
    

    A ref int[] would be a int** (but it could be complex to pass, because normally you RECEIVE the array, not SEND the array :-) )

    Note that your "interface" is quite poor: you can't tell to ReadStuff the length of your buffer, nor can you receive the necessary length of the buffer, nor can you receive the number of characters of the buffer that were really used.

    0 讨论(0)
  • 2021-01-18 21:43

    You could do something like this:

    [DllImport(dllName)]
    static extern void ReadStuff(int id, IntPtr buffer, int length);
    
    
    int[] array = new int[12];
    
    unsafe
    {
      fixed (int* data = &array[0])
        ReadStuff(1, (IntPtr)data, array.Length);
    }
    

    C++ code: (not tested)

    extern "C" __declspec(dllexport) VOID WINAPI ReadStuff(int id, int* buffer, int length);  
    
    0 讨论(0)
提交回复
热议问题