Код: Выделить всё
// 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 struct
struct TestStruct {
unsigned int id;
char name[BUFFER_32];
};
Мне также пришлось жестко запрограммировать SizeConst = 7, чтобы этот тест работал... но во время выполнения я не буду знать размер значения имени, поэтому это решение в любом случае не будет работать как есть. Я попытался установить для него значение SizeConst = 32, чтобы оно соответствовало размеру структуры char[] C, но я получаю «исключение: тип не может быть маршалирован, поскольку длина экземпляра встроенного массива не соответствует объявленной длине в макете».
Нужно ли вообще использовать [MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]? Я думал, что это для получения данных из неуправляемого кода DLL... но я передаю char[] в DLL? Когда я удаляю его, я получаю «исключение: указанный массив не соответствует ожидаемому типу».
Я тоже пробовал...
Код: Выделить всё
[MarshalAs(UnmanagedType.LPArray)]
public char[] name;
Любая помощь будет оценена по достоинству...
Подробнее здесь: https://stackoverflow.com/questions/792 ... truct-to-c
Мобильная версия