Извините, если вопрос немного не в порядке. При использовании PInvoke в C # некоторым функциям требуются структуры, которые будут заполнены данными, но из того, что я видел, некоторые функции работают, только когда указанная структура в C # написана как класс, поэтому вместо public struct StructName
вы бы сделали public class StructName
.
Если вы не понимаете, о чем я, вы можете попробовать запустить этот код и посмотреть, что произойдет
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([In, Out] SystemInfoStruct lpSystemInfo);
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([In, Out] SystemInfoClass lpSystemInfo);
[StructLayout(LayoutKind.Sequential)]
public struct SystemInfoStruct
{
public ushort wProcessorArchitecture;
private ushort wReserved;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
private uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort wProcessorLevel;
public ushort wProcessorRevision;
}
[StructLayout(LayoutKind.Sequential)]
public class SystemInfoClass
{
public ushort wProcessorArchitecture;
private ushort wReserved;
public uint dwPageSize;
public IntPtr lpMinimumApplicationAddress;
public IntPtr lpMaximumApplicationAddress;
public IntPtr dwActiveProcessorMask;
public uint dwNumberOfProcessors;
private uint dwProcessorType;
public uint dwAllocationGranularity;
public ushort wProcessorLevel;
public ushort wProcessorRevision;
}
class Program
{
static void Main()
{
//SystemInfoClass infoClass = new SystemInfoClass();
//GetSystemInfo(infoClass);
//SystemInfoStruct infoStruct = new SystemInfoStruct();
//GetSystemInfo(infoStruct);
}
}
По крайней мере для меня, использование структуры не удалось и вернулось с ошибкой запрещенного доступа, с другой стороны, с помощью сработавшего класса.
Итак, вопрос в том, когда вы должны использовать структуры и когда вы должны использовать классы для функций PInvoke, или вы должны всегда использовать классы?
Кто знает, может быть, я упускаю из виду что-то важное.