Ваши объявления маршалинга для структуры C # не соответствуют вашей структуре C ++, они соответствуют этой структуре c ++
typedef TPARAMETER_DATA
{
char parameter[50000];
int size;
} PARAMETER_DATA;
Возможно, вам удастся заставить это работать с каким-то специальным кодом Marshaling, но я думаю, что более простой способ - изменить способ распределения на стороне C ++.
Я уверен, что есть и другие способы сделать это, но один из способов, который я получил, - это использовать SAFEARRAY. SAFEARRAY является частью стандартного COM API, созданного изначально для взаимодействия с VB (я думаю). http://msdn.microsoft.com/en-us/library/ms221145.aspx
SAFEARRAY знает свой размер и тип данных, поэтому маршалеру легко с ним справиться. Я должен быть заблокирован, прежде чем вы сможете писать в него в C ++, а затем разблокировать, прежде чем пытаться его маршалировать.
Итак, ваша новая структура параметров такова (я не думаю, что размер нужен, SAFEARRAY уже знает)
typedef TPARAMETER_DATA
{
SAFEARRAY * parameter;
int size; // I think this is redundant.
}
В вашем коде C ++ вы выделяете массив, используя
SAFEARRAY * psa = SafeArrayCreateVector(VT_UI1, 0, 50000);
if ( ! psa)
return E_OUTOFMEMORY;
HRESULT hr = SafeArrayLock(psa);
if (FAILED(hr))
{
SafeArrayDestroy(psa);
return hr;
}
CopyMemory(psa->pvData, mydataptr, 50000);
SafeArrayUnlock(psa);
PARAMETER_DATA pda = {psa, 50000};
Тогда объявление C # для структуры будет
[StructLayout(LayoutKind.Sequential)]
public struct PARAMETER_DATA
{
[MarshalAs(UnmanagedType.SafeArray)]
public byte[] data; // I used System.Array here, but I think byte[] is OK
[MarshalAs(UnmanagedType.I4)]
public int size;
}