Соглашение о вызовах паскаль - это ваша проблема.Он древний, маршаллер пинвока не поддерживает его.Он передает аргументы слева направо, маршаллер pinvoke принимает stdcall, поэтому передает их справа налево.Вместо этого используйте __stdcall:
__declspec( dllexport )
double __stdcall Process(lpUnmagedStruct lpStruct, int size, char* szMessage, int messageSize);
Следующая проблема - строка, для возврата которой необходимо использовать StringBuilder в объявлении и передать инициализированный в вызове:
[DllImport("MyDll.dll", EntryPoint="Process", CharSet = CharSet.Ansi)]
public static extern double Process(ManagedStruct[] myStruct, int size, StringBuilder message, int messageSize);
...
var buffer = new StringBuilder(666);
double retval = Process(arrayOfStruct, 3, buffer, buffer.Capacity);
var message = buffer.ToString();
Я взялсвобода добавления аргумента messageSize, необходимая для безопасного копирования строки в буфер сообщений, не рискуя уничтожить кучу мусора.