Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

JaredPar написал что-то на своем blogfollow-up).

Ответ 2

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

Ответ 3

посмотрите Документ Microsoft

Он говорит, что для 64-битного приложения size_t имеет 64-битный int.

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

Ответ 4

Я нашел грязный хак, который поможет вам добиться подобного поведения. Для этого требуется определить символ компиляции _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 изменить его тип в зависимости от платформы, но правильная перегрузка необходимых операторов очень сложная!