c# создание объекта в определенном адресе памяти
Возможно ли в C# (в небезопасном Codecontext ) создать объект по определенному адресу памяти?
Мой Код:
object _apiId = new ApiId();
var apiID = (ApiId)_apiId;
ApiId* pointer = &apiID;
Debug.Write(new Intptr(pointer));
2 ответа:
Нет, потому что адрес памяти не имеет смысла, когда GC может перемещать объекты и указатели становятся недействительными. Вот почему здесь используется ключевое слово
reference
вместоpointer
Обходной путь:
P / вызов метода: memcpy из msvrct.dll:
[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] public static extern IntPtr memcpy(IntPtr dest, IntPtr src, UIntPtr count);
Вам нужен размер объекта, который вы хотите скопировать:
var size = (uint) Marshal.SizeOf(obj);
Вам нужно закрепить его:
GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);
Наконец вызовем метод memcpy:
var _adress = NativeMethods.memcpy(new IntPtr(1115911111), handle.AddrOfPinnedObject(), new UIntPtr(size));