Когда вы используете PInvoke, когда вы должны использовать класс и когда struct, когда вас попросят ввести указатель на структуру NAME? - PullRequest
0 голосов
/ 17 сентября 2018

Извините, если вопрос немного не в порядке. При использовании 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, или вы должны всегда использовать классы? Кто знает, может быть, я упускаю из виду что-то важное.

1 Ответ

0 голосов
/ 17 сентября 2018

Как правило, вы должны использовать все, что https://pinvoke.net/ говорит, что вы должны использовать. Если он говорит, что его нужно вызвать с struct, передайте struct. Если он говорит, что его нужно вызвать с class, передайте class.

Теперь, если вы хотите жить опасно, вы можете попробовать поменять class и struct, но помните о том, что прохождение class не совсем эквивалентно прохождению struct; вместо этого это эквивалентно передаче struct на ref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...