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