Как маршалировать структуру с помощью вложенного массива структур при использовании 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как маршалировать ответ XML с помощью пользовательских пространств имен в Java
    Гость » » в форуме JAVA
    0 Ответы
    50 Просмотры
    Последнее сообщение Гость
  • Spring Boot 3 - невозможно маршалировать/демаршалировать приложение/XML в основном в HTTP-запросах
    Гость » » в форуме JAVA
    0 Ответы
    42 Просмотры
    Последнее сообщение Гость
  • Невозможно маршалировать возвращаемое значение [дубликат]
    Гость » » в форуме C#
    0 Ответы
    26 Просмотры
    Последнее сообщение Гость
  • Как вы можете маршалировать массив байтов в C#?
    Anonymous » » в форуме C#
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как эффективно передать структуру C#, содержащую массив структур, в функцию C++?
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

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