Как передать C short * в управляемую сборку C # в C / CLI

#c# #c -cli

#c# #c -cli

Вопрос:

У меня возникли проблемы с передачей аргумента из кода C / CLI в функцию .NET C #.

В C у меня есть нечто похожее на следующее:

 void SomeFunction(short *id)
{
   CSharpClass::StaticClassInstance->SetValue(id);
}
  

На стороне C # функция объявляется с аргументом ref как:

 public void SetValue(ref short id)
{
  id = this.internalIdField;
}
  

Ошибка компилятора, которую я получаю при вызове setValue (id), звучит так: «не удается преобразовать параметр 1 из ‘short *’ в ‘short %'».

Я обнаружил, что ссылка для отслеживания (%) эквивалентна C # ref, но я не знаю, как использовать ее с параметром short *, который я пытаюсь передать.

Заранее спасибо.

Ответ №1:

Логическая сигнатура C / CLI CSharpClass::SetValue является

 void SetValue(short% id);
  

Если вы знаете C (в отличие от C / CLI), ответ здесь точно такой же, как если бы у вас была подпись C

 void SetValue(shortamp; id);
  

Т.е. просто разыменовать указатель:

 void SomeFunction(short *id)
{
    CSharpClass::StaticClassInstance->SetValue(*id);
}
  

Комментарии:

1. Большое спасибо за ответ. Я мог бы поклясться, что уже пробовал это, но, по-видимому, у меня не должно быть, потому что, как только я разыменовал указатель, он скомпилировался. Приветствия.

Ответ №2:

Если вы хотите быть многословным, объявите ссылку отслеживания, назначьте ссылку отслеживания вашему параметру id, а затем передайте ссылку отслеживания вашей функции…

 short %s = *id;

SetValue (s);
  

Если вы не хотите быть многословным, просто разыменуйте указатель. Хотя компилятор не может преобразовать short * в short %, он может преобразовать short в short %…

 SetValue (*id);