ключевое слово ref и методы-оболочки - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть интерфейс, IProxy и прокси реализации.Цель прокси-сервера заключается в том, чтобы обернуть некоторые внешние функции, которые вызывают в C-библиотеку.Для внешних деклараций это требует, чтобы структуры передавались с использованием ключевого слова ref.Вот пример:

namespace CFuncs {
  [DllImport("cLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
  public static extern int MyCFunc(ref MyStruct result);
}

public interface IProxy { public int MyFunc(MyStruct result); }

public class Proxy : IProxy { 
  public int MyFunc(MyStruct result) { 
    return CFuncs.MyCFunc(ref result);
  }
}

Объявление функции из файла заголовка C:

int MyCFunc (MY_STRUCT* result);

typedef struct  { 
  // some fields
} MY_STRUCT;

И код вызова:

var proxy = new Proxy();
var result = new MyStruct();
proxy.MyFunc(result);

Мой вопрос, должен ли яиспользовать ref в интерфейсе и реализации оболочки, или структура будет правильно заполнена данными функцией C?

EDIT: код, представленный в качестве примера, кажется, работает.Может ли быть так, что, хотя библиотека C хочет указатель, она никогда не меняет его?Является ли ref обязательным для взаимодействия с функциями, которые принимают указатели?В примере кода C, поставляемого с библиотекой, всегда есть вызывающая сторона, выделяющая память для требуемых структур, если это что-то значит.

1 Ответ

1 голос
/ 21 февраля 2012

.NET использует вызов по значению, и, более того, struct является типом значения - следовательно, если вы хотите, чтобы оно было изменено внешней функцией, это должен быть параметр ref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...