Я пытаюсь написать хорошую P/Invoke подписи для Windows SetupAPI вызовов, и я столкнулся со следующей проблемой с упаковкой структур SetupAPI в:Определение C# P/Invoke Структура Alignment во время выполнения
// Excerpt from setupapi.h
#if defined(_WIN64)
#include <pshpack8.h> // Assume 8-byte (64-bit) packing throughout
#else
#include <pshpack1.h> // Assume byte packing throughout (32-bit processor)
#endif
Теперь это означает, что я не могу просто установить свойство StructLayoutAttribute.Pack
на постоянное значение.
Я пытался делать следующее:
[StructLayout(LayoutKind.Sequential, Pack = Environment.Is64BitProcess ? 8 : 1)]
public struct SP_DEVINFO_DATA
{
public uint cbSize;
public Guid ClassGuid;
public uint DevInst;
public IntPtr Reserved;
}
Как и ожидалось, это не удается из-за ошибки компиляции:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
Я бы очень хотел, чтобы избежать #if
и настройке различных платформ компиляции, в отличие от Any CPU
. Могу ли я определить упаковку структуры C# во время выполнения?
Не нужно взломать IntPtr, вы можете просто объявить перегрузку функции, которая принимает другой тип структуры. –
Тонкая настройка, предлагаемая @HansPassant, звучит достаточно элегантно. Должны ли мы добавить его к ответу? – DoomMuffins