Как маршалировать структуру с помощью вложенного массива структур при использовании P/Invoke C#C#

Место общения программистов C#
Ответить
Anonymous
 Как маршалировать структуру с помощью вложенного массива структур при использовании P/Invoke C#

Сообщение Anonymous »

У меня есть следующее объявление функции C, которое я хотел бы вызвать из C# (обратите внимание, что я не могу получить доступ к исходному коду dll):

Код: Выделить всё

int setData(OuterStruct *data);
И соответствующие структуры для этой функции C следующие:

Код: Выделить всё

typedef struct InnerStruct
{
unsigned int a
unsigned int b
unsigned char *c
} InnerStruct;

typedef struct OuterStruct
{
unsigned int d
InnerStruct *e
} OuterStruct;
На данный момент я сделал следующее:

Создал варианты управляемой структуры

Код: Выделить всё

[StructLayout(LayoutKind.Sequential)]
public struct OuterStruct
{
public uint d;

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public InnerStruct[] e
}

[StructLayout(LayoutKind.Sequential)]
public struct InnerStruct
{
public uint a;
public uint b;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
public byte[] c
}
создал метод DllImport

Код: Выделить всё

[DllImport("myDll.dll", EntryPoint ="setData", CallingConvention= CallingConvention.StdCall]
public static extern int setData(ref OuterStruct data);
Вызвал мой метод и получил константу «AccessViolationException». На данный момент я не уверен, проблема ли это с моей стороны или с .dll и тем, как она обрабатывает ввод, но хочу сначала устранить любые незавершенные вопросы, которые могут у меня возникнуть.
Примечание. Я создал множество других методов P/Invoke для этой .dll, которые используют простые структуры, но только этот не работает. Кроме того, проект .dll и C# работает как 32-битный

Подробнее здесь: https://stackoverflow.com/questions/783 ... voke-c-sha
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»