Маршалинг типов данных из C# Struct в CC#

Место общения программистов C#
Ответить
Anonymous
 Маршалинг типов данных из C# Struct в C

Сообщение Anonymous »

Я пытаюсь определить правильный тип для маршалинга char[] в функцию C dll. Следующий код правильно отправляет в dll данные char[] и возвращает ожидаемый результат из dll, но я не думаю, что делаю это правильно.

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

// C# code

public struct TestStruct {

public uint id;

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] name;

};

[DllImport("Test.dll", CallingConvention = CallingConvention.StdCall)]
internal static extern void testFunction(ref TestStruct ts);

string name = "name123"; // 7 chars

TestStruct ts = new TestStruct();

ts.name = name.ToCharArray();

// C dll function uses ts.name to set ts.id value
testFunction(ref ts);

Это соответствующее определение структуры C

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

// C struct
struct TestStruct {

unsigned int id;

char name[BUFFER_32];
};

Использование UnmanagedType.ByValArray не может быть правильным, поскольку я использую char[], а код C# должен работать с символами, а не с байтами.
Мне также пришлось жестко запрограммировать SizeConst = 7, чтобы этот тест работал... но во время выполнения я не буду знать размер значения имени, поэтому это решение в любом случае не будет работать как есть. Я попытался установить для него значение SizeConst = 32, чтобы оно соответствовало размеру структуры char[] C, но я получаю «исключение: тип не может быть маршалирован, поскольку длина экземпляра встроенного массива не соответствует объявленной длине в макете».
Нужно ли вообще использовать [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]? Я думал, что это для получения данных из неуправляемого кода DLL... но я передаю char[] в DLL? Когда я удаляю его, я получаю «исключение: указанный массив не соответствует ожидаемому типу».
Я тоже пробовал...

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

[MarshalAs(UnmanagedType.LPArray)]
public char[] name;

Но получите «исключение: невозможно маршалировать поле «имя» типа «TcSymbol»: этот тип можно маршалировать только ограниченными способами».
Любая помощь будет оценена по достоинству...

Подробнее здесь: https://stackoverflow.com/questions/792 ... truct-to-c
Ответить

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

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

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

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

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