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

Получить значение указателя через отражение

У меня есть экземпляр типа object, из которого я знаю, что это указатель (можно легко проверить с помощью myobject.GetType().IsPointer). Можно ли получить значение указателя через отражение?

код пока:

object obj = .... ; // type and value unknown at compile time
Type t = obj.GetType();

if (t.IsPointer)
{
    void* ptr = Pointer.Unbox(obj);

    // I can obtain its (the object's) bytes with:
    byte[] buffer = new byte[Marshal.SizeOf(t)];
    Marshal.Copy((IntPtr)ptr, buffer, 0, buffer.Length);

    // but how can I get the value represented by the byte array 'buffer'?
    // or how can I get the value of *ptr?
    // the following line obviously doesn't work:
    object val = (object)*ptr; // error CS0242 (obviously)
}


Дополнение №1: Поскольку рассматриваемый объект имеет тип значения , а не ссылочный тип, я не могу использовать GCHandle::FromIntPtr(IntPtr), за которым следует GCHandle::Target для получения значения объекта. ..

28.05.2016

  • FromIntPtr ожидает дескриптор GC. Он вообще не может работать с указателями. Просто указываю на это. 28.05.2016
  • I can obtain its bytes with: Это не получает байты указателя. Он получает 4 или 8 байтов из области памяти, на которую указывает obj. Что вы подразумеваете под значением указателя? Это ptr! 28.05.2016
  • @usr: относительно вашего первого комментария: я знаю это, поэтому я сказал, что это не сработает, потому что это тип значения. относительно вашего второго комментария: я получаю байты значения, а не указателя. 28.05.2016
  • и что я имею в виду со значением указателя? Я имею в виду *ptr, то есть значение объекта, хранящегося по адресу, на который указывает ptr ;) 28.05.2016
  • GCHandle не будет работать, даже если это будет тип ref. GCHandle отличается от указателя на объект. Вы не можете получить дескриптор указателя.; msdn.microsoft.com/en-us/ библиотека/4ca6d5z7(v=vs.110).aspx работает? Вам нужно определить тип структуры по типу указателя. Я предполагаю, что это возможно. 28.05.2016
  • PtrToStructure хороший звонок - посмотрю 28.05.2016

Ответы:


1

Я полагаю, что вам нужно PtrToStructure. Что-то вроде этого:

if (t.IsPointer) {
    var ptr = Pointer.Unbox(obj);

    // The following line was edited by the OP ;)
    var underlyingType = t.GetElementType();
    var value = Marshal.PtrToStructure((IntPtr)ptr, underlyingType); 
}
28.05.2016
  • Что ж, я оставил отговорку в комментарии, так что, может быть, бог программистов меня простит :) Знаете ли вы надежный способ получить базовый тип из типа указателя? 28.05.2016
  • @Evk: Большое спасибо, сэр :) Я также отредактировал вашу четвертую строку кода;) 28.05.2016
  • Да, спасибо за то, что вы сказали, как получить тип из типа указателя. 28.05.2016
  • Вызов базового типа указателя как типа элемента — своего рода хак. Я не видел этого API. LINQpad не показал никаких полезных свойств. 28.05.2016
  • Новые материалы

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

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

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

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

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

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

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