Как корректно передать указатель на массив в .Net
у меня есть структура на С++
struct {
CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAGS Flags;
NTSTATUS CompletionStatus;
LARGE_INTEGER PlaceholderTotalCount;
CF_PLACEHOLDER_CREATE_INFO *PlaceholderArray;
DWORD PlaceholderCount;
DWORD EntriesProcessed;
} TransferPlaceholders;
и маршалинг на c#
[StructLayout(LayoutKind.Sequential, Pack =1)]
public struct TRANSFERPLACEHOLDERS
{
/// <summary>Flags for transferring placeholders.</summary>
public CF_OPERATION_TRANSFER_PLACEHOLDERS_FLAGS Flags;
/// <summary>The completion status of the operation.</summary>
public NTStatus CompletionStatus;
/// <summary>Total number of placeholders.</summary>
public long PlaceholderTotalCount;
/// <summary>An array of placeholders to be transferred.</summary>
public IntPtr PlaceholderArray;
/// <summary>The number of placeholders being transferred.</summary>
public uint PlaceholderCount;
/// <summary>The placeholder entries that have been processed.</summary>
public uint EntriesProcessed;
}
PlaceholderArray - в этой структуре это массив объектов структуры CF_PLACEHOLDER_CREATE_INFO.
я создаю объект TRANSFERPLACEHOLDERS и пытаюсь передать туда массив CF_PLACEHOLDER_CREATE_INFO следующим образом:
CF_PLACEHOLDER_CREATE_INFO[] tmparr = new CF_PLACEHOLDER_CREATE_INFO[2] { tmp, tmp2 };
IntPtr ptrPlaceholders = tmparr.MarshalToPtr(Marshal.AllocHGlobal, out _);
var transferPlaceholders = new CF_OPERATION_PARAMETERS.TRANSFERPLACEHOLDERS
{
CompletionStatus = completionStatus,
PlaceholderArray = ptrPlaceholders,
PlaceholderCount = (uint)tmparr.Length,
// EntriesProcessed = 0,
PlaceholderTotalCount = (uint)tmparr.Length,
Flags = flags
};
Но в таком случае получаю Access Violation. В чём может быть проблема?
Ответы (1 шт):
Автор решения: Nisus
→ Ссылка
Вообще можно включить UNSAFE для проекта или использовать unsafe-блок в коде и оперировать привычной "*". Покажите импорт метода в который передаете эту структуру, по идее туда прямо массив и надо передавать, маршаллинг сам все сделает.