c# Как получить значение из адреса памяти и привести его к основному типу? - PullRequest
0 голосов
/ 18 марта 2020

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

Мой пример:

ListItem<string> item = new ListItem<string>("hell to world"); //ListItem<T> is class
unsafe
{
   TypedReference itemRef = __makeref(item);
   IntPtr reference = **(IntPtr**)&item;
   long address = (long)reference;
}

Я могу использовать __refvalue. этот метод требует TypedReference и тип, к которому вы хотите привести значение. Эта работа, но я не знаю, как получить это TypedReference от void*, IntPtr или long. Я надеюсь, что кто-нибудь поможет мне

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

UPD: я написал это только из личного интереса, не более

1 Ответ

1 голос
/ 18 марта 2020

Попробуйте использовать Marshal.PtrToStructure метод https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.ptrtostructure?view=netframework-4.8#System_Runtime_InteropServices_Marshal_PtrToStructure_System_IntPtr_System_Type_

Если это не то, что вам нужно, вы можете увидеть другие Marshal и MarshalEx методы. Эти классы созданы для работы с указателями в C#.

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