У меня действительно тяжелое время, чтобы упустить этот маршаллинг.
У меня неуправляемый код, который выглядит следующим образом:
WORD HLP_GetDeviceNames (LPSTR *DevNames, WORD Max_Len, WORD Max_Num)
Просто к вашему сведению, я не писал этот неуправляемый код, но должениспользуй это.
Возвращает: WORD, указывающее на ошибку.
DevNames: Указатель на массив массивов символов.В основном массив строк, которые будут изменены и возвращены мне!
Max_Len: длина каждой строки (мне сказали, что это должно быть 256)
Max_Num: длина массива.Я использую другой работающий вызов Invoke, который сообщает мне количество устройств, поэтому я точно знаю, сколько строк отправить.
Я использовал взаимодействие P / Invoke signatureToolkit, чтобы выяснить многое из этого, но также прочитал кучучтобы получить еще дальше.Где я сейчас нахожусь здесь:
[DllImport("UsbMeasLib.dll")]
public static extern ushort HLP_GetDeviceNames([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] ref StringBuilder[] DevNames, ushort Max_Len, ushort Max_Num);
Я называю свой код следующим образом:
StringBuilder[] DevNames = new StringBuilder[deviceCount];
for(int i = 0; i< deviceCount; i++)
{
DevNames[i] = new StringBuilder().Append(' ', 256);
}
HachUsbMeasLib.HLP_GetDeviceNames(ref DevNames, 256, Convert.ToUInt16(DevNames.Count()));
Я использую массив компоновщика строк, потому что мне нужен неуправляемый код, чтобы модифицировать компоновщик строк так,что он может вернуть новую строку, так как строка неизменна.
Когда я запускаю код, мой массив не изменяется!
Я не совсем уверен, что происходит, но я думаю, что это имеетчто-то связанное с тем, что CLR говорит неуправляемому коду не изменять мой массив на месте, а создает новую ссылку (указатель).Даже если это так, я не знаю, как это исправить.
Спасибо за любые идеи, которые кто-либо может предложить!