Как корректно передать указатель на массив в .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-блок в коде и оперировать привычной "*". Покажите импорт метода в который передаете эту структуру, по идее туда прямо массив и надо передавать, маршаллинг сам все сделает.

→ Ссылка