Насколько я вижу, есть несколько проблем.
1) C # использует __stdcall для вызова функций C.
Поэтому вы должны добавить атрибут [DllImport (PATH, CallingConvention = CallingConvention.Cdecl)] или указать атрибут __stdcall для вашей функции C.
2) Если вам нужно передать массив, вам не нужно ключевое слово "ref".
[DllImport(PATH)]
public static extern int MyFunction(byte[] src);
extern DECLSPEC int __stdcall MyFunction(unsigned char* src);
3) Вы не можете использовать в C # массив, выделенный из C ++.
Вам необходимо скопировать его в управляемую память (массив C #).
Для этого вы можете сделать две функции, например.
Тот, который подсчитывает, сколько символов вам нужно для вашего нового массива.
Еще один, который выполняет преобразование в массиве назначения.
Так что вы можете сделать что-то вроде этого:
public static byte[] MyConvert(byte[] myArray)
{
// Function defined in your C/C++ dll that compute how much space you need.
int count = CountRequiredChars(myArray);
byte[] myNewArray = new byte[count];
// Function defined in your C/C++ dll that writes into myNewArray the output.
PerformMyConversion(myArray, myNewArray);
return myNewArray;
}
PerformMyConversion не должен возвращать новый массив, он должен копировать содержимое преобразования в выходной параметр.