2014-12-04 2 views
2

Возможно ли в C# (в небезопасном Codecontext) создать объект по определенному адресу памяти?C# создание объекта в определенном адресе памяти

Мой код:

object _apiId = new ApiId(); 
var apiID = (ApiId)_apiId; 
ApiId* pointer = &apiID; 
Debug.Write(new Intptr(pointer)); 
+0

Метод Marshall.StructureToPtr может помочь вам. Если вы объясните немного лучше, чего вы хотите достичь, я могу дать вам лучший намек. – Dan

ответ

1

Обход:

р/вызов метода: тетср из 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); 

наконец вызвать метод тетсру:

var _adress = NativeMethods.memcpy(new IntPtr(1115911111), handle.AddrOfPinnedObject(), new UIntPtr(size)); 
1

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

+2

Лично я не нахожу объяснения, которые могут быть удовлетворительными. В других ситуациях GC может быть «выведен из уравнения» (например, «GCHandleType.Pinned»), поэтому меня не удивит, если что-то подобное можно было бы сделать в этой ситуации. – dcastro

+0

Массивы и т. Д. Могут быть закреплены, но у вас нет полного контроля над небезопасным кодом C++. Например, код типа MyStruct x = * (MyStruct *) ((void *) 0xDEADBEEF) не допускается даже в небезопасном C# –

+0

Я знаю, что «небезопасно» ограничено на C#, но я не думаю, что «адрес памяти не имеет смысла, когда GC может перемещать объекты, а указатели становятся недействительными »- вот почему. – dcastro

Смежные вопросы