Нет, то, что вы конкретно просите, невозможно. В отличие от массивов в стиле C / C ++ (упрощенно - это просто блоки памяти, равные sizeof(Type) * n
, где n
- количество элементов), массивы .NET не могут ссылаться или смещаться арифметикой указателей *. В результате, если общедоступный API не предоставит вам способ указать смещение в массиве, вам придется передать промежуточные массивы в функцию и собрать их самостоятельно, как только вы закончите.
Однако вы можете заключить вызов в собственную версию функции:
public int GetValues(byte source_id, byte first_value_address, byte number_of_values, uint[] buffer, int offset)
{
uint[] temp = new uint[number_of_values];
int retValue = GetValues(source_id, first_value_address, number_of_values, temp);
Array.Copy(temp, 0, buffer, offset, number_of_values);
return retValue;
}
Следует также отметить, что ByVal
и ByRef
представляют соглашения о вызовах, независимо от того, является ли тип типом значения. Если у вас нет конкретной причины (а здесь, похоже, у вас ее нет), вам не нужно указывать ByRef
в аргументе массива. Единственный тип ByRef
требуется, когда функция изменит фактическое значение переменной, и вы хотите, чтобы это отражалось в вызывающем коде. То, как вы его вызываете, похоже, что вы выделяете массив, передаете его функции, а затем используете его содержимое. Единственный раз, когда функция изменяет значение переменной, это если она установлена равной другой экземпляр массива ; простое изменение значений массива не требует ByRef
, чтобы вызывающий код мог видеть результаты.
** Если вы на самом деле не используете код unsafe
и не делаете массивы на основе указателей самостоятельно, но это выходит за рамки вашего вопроса *