Как к P/Invoke, когда указатели включены

Идиома более полезна, когда Вы пишете while цикл вместо if оператор. Для if оператор, можно разбить его, как Вы описываете. Но без этой конструкции, необходимо было бы или повторить себя:

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

или использование loop-and-a-half структура:

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

я обычно предпочитал бы форму loop-and-a-half.

8
задан Will Eddins 14 September 2009 в 16:50
поделиться

2 ответа

Если указатель указывает на один примитивный тип, а не на массив, используйте ref / out для описания параметра

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount);

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value)

В этих примерах out, вероятно, более уместен, но любой из них будет работать.

12
ответ дан 5 December 2019 в 14:04
поделиться

Среда выполнения .NET может выполнять большую часть этого преобразования (называемого «маршалингом») за вас. Хотя явный IntPtr всегда будет делать ТОЧНО то, что вы ему скажете, вы, вероятно, можете заменить ключевое слово ref на такой указатель.

[DllImport("USB4.dll")]
public static extern int USB4_Initialize(ref short deviceCount); //short*

[DllImport("USB4.dll")]
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong*

Затем вы можете вызвать их так:

short count = 0;

USB4_Initialize(ref count);

// use the count variable now.
0
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: