Nano Hash - криптовалюты, майнинг, программирование

При использовании PInvoke, когда вы должны использовать класс и когда структуру, когда вас просят ввести указатель на структуру NAME?

Извините, если вопрос немного не по адресу. При использовании 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);
    }
}

По крайней мере, для меня использование структуры не удалось и вернулось с ошибкой отказа в доступе r/w, с другой стороны, использование класса сработало. Итак, вопрос в том, когда вы должны использовать структуры и когда вы должны использовать классы для функций PInvoke, или вы всегда должны использовать классы? Кто знает, может быть, я упускаю из виду что-то важное.

16.09.2018

  • Это как-то связано с C или C++? 17.09.2018
  • Добро пожаловать в Stack Overflow. Пожалуйста, прочитайте О и Как спросить страниц в ближайшее время. Также обратите внимание, что включение нескольких языковых тегов в один вопрос не популярно; люди склонны голосовать против таких вопросов. Ваш код выглядит как С#; и ответ на C вам не поможет, как и ответ на C++ — это 3 радикально разных языка. Выберите только один языковой тег. 17.09.2018
  • Была ли вызванная вами функция управляемой или неуправляемой? 17.09.2018
  • @jdweng, что ты имеешь в виду? GetSystemInfo неуправляемый. 17.09.2018
  • Использование структуры является нормальным и рекомендуемым способом, но вы должны соответствовать собственному объявлению функции. Из документации MSDN Указатель на структуру SYSTEM_INFO, которая получает информацию. Для создания указателя на структуру требуется out в объявлении [DllImport]. Когда вы объявляете его как класс, ссылочный тип, вы автоматически получаете указатель и не используете out. 17.09.2018
  • @HansPassant О, понятно. Не знал этого, спасибо, что объяснили мне. :) 17.09.2018
  • Get SystemInfo является частью Kernal32.dll. См. pinvoke: pinvoke.net/default.aspx/kernel32/GetSystemInfo.html 17.09.2018

Ответы:


1

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

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

16.09.2018
  • @HansPassant вопрос оставался без ответа более получаса, прежде чем я предоставил ОП ответ, который решает его проблему. Сделал по памяти, пока не пользовался .Net где-то лет 6. Не стесняйтесь редактировать мой ответ, чтобы исправить мои ошибки. 17.09.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..