Ответ 1
UIntPtr будет работать (возможно, IntPtr тоже работает, но size_t не имеет знака, поэтому UIntPtr лучше подходит)
У меня есть часть .NET-кода, которую я хочу передать в 64-разрядный. Коды в основном представляют собой набор вызовов P/Invoke для некоторых других C dll. Одна из функций в C dll имеет параметр 'size_t'. Какой тип данных следует использовать в моей P/Invoke-сигнатуре, чтобы маршаллинг работал нормально. Я думал об использовании IntPtr или UIntPtr, но некоторые говорят, что они эквивалентны указателю в .NET и не должны использовать его. Кто-нибудь знает, какой правильный тип для этого?
UIntPtr будет работать (возможно, IntPtr тоже работает, но size_t не имеет знака, поэтому UIntPtr лучше подходит)
Если size_t изменяется в зависимости от платформы, вам придется использовать IntPtr. Если это фиксированный размер целого числа, используйте int, uint или long (в зависимости от исходного объявления).
посмотрите Документ Microsoft
Он говорит, что для 64-битного приложения size_t имеет 64-битный int.
Однако, если DLL, которую вы вызываете, представляет собой 32-битную dll, вам нужно передать только 32-битный int
Я нашел грязный хак, который поможет вам добиться подобного поведения. Для этого требуется определить символ компиляции _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
изменить его тип в зависимости от платформы, но правильная перегрузка необходимых операторов очень сложная!