.NET эквивалент size_t - PullRequest
       13

.NET эквивалент size_t

10 голосов
/ 21 апреля 2009

У меня есть кусок кода .NET, который я хочу перенести на 64-битный. Коды в основном представляют собой набор вызовов P / Invoke для других Cll. Одна из функций в C dll имеет параметр size_t. Какой тип данных я должен использовать в моей подписи P / Invoke, чтобы сортировка работала нормально. Я думал об использовании IntPtr или UIntPtr, но некоторые говорят, что они эквивалентны указателю в .NET и не должны его использовать. Кто-нибудь знает, каков правильный тип для этого?

Ответы [ 4 ]

17 голосов
/ 21 апреля 2009

UIntPtr будет работать (IntPtr, вероятно, тоже будет работать, но size_t без знака, так что UIntPtr лучше подходит)

ДжаредПар написал что-то в своем блоге дополнении ) по этому поводу.

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

Я нашел грязный хак, который может помочь вам добиться подобного поведения. Это требует, чтобы вы определили символ компиляции _WIN64 для ваших 64-битных сборок, а затем вы можете сделать следующее:

#if _WIN64
    using size_t = UInt64;
#else
    using size_t = UInt32;
#endif

Примечание: вам придется использовать приведенный выше код в каждом файле, который хочет использовать тип size_t.

Вы также можете определить свой собственный целочисленный тип (во многом аналогично тому, как определен UInt64) и использовать его повторно, не помещая приведенный выше код в каждый файл, которому требуется доступ к size_t, но это очень сложно (imho).

#if _WIN64
    using _size_t = UInt64;
#else
    using _size_t = UInt32;
#endif

[Serializable]
[CLSCompliant(false)]
[ComVisible(true)]
public struct size_t : IComparable, IFormattable, IConvertible, IComparable<_size_t>, IEquatable<_size_t>
{
    private _size_t _value;

    public size_t(_size_t val)
    {
        _value = val;
    }

    // You have to add all of your overloads below
}

Это позволит size_t изменять его тип в зависимости от платформы, но корректно перегрузить необходимые операторы очень сложно!

1 голос
/ 21 апреля 2009

посмотрите на этот документ от Microsoft

В 64-битном приложении указано, что size_t - 64-битное целое.

Однако, если DLL, которую вы вызываете, является 32-битной DLL, вам нужно только передать 32-битное int

1 голос
/ 21 апреля 2009

Если size_t варьируется в зависимости от платформы, вам придется использовать IntPtr. Если это целое число фиксированного размера, используйте int, uint или long (в зависимости от исходного объявления).

...