С # недействительный указатель?

Есть ли способ вызвать адрес памяти (например, (void *) f = 0xFFFF;) БЕЗ IntPtr или каких-либо собственных функций Win32. Мне нужно сделать это для исполняемого загрузчика (это для ОС, которая использует проект с открытым исходным кодом под названием COSMOS)


person user1454902    schedule 25.08.2012    source источник
comment
Почему без IntPtr? Тогда как вы хотите выразить значение указателя? Вы можете использовать переменные типа указателя в небезопасном коде.   -  person Mohammad Dehghan    schedule 25.08.2012
comment
Я не эксперт в этом вопросе, но это возможно в пределах unsafe блока. (msdn.microsoft.com/en-us /library/y31yhkeb%28v=vs.100%29.aspx и stackoverflow.com/questions/3069448/)   -  person Jensen    schedule 25.08.2012
comment
Я не могу использовать IntPtr, потому что я использую собственный компилятор C #, который не имеет реализаций большей части .NET framework, включая IntPtrs   -  person user1454902    schedule 25.08.2012
comment
@ user1454902 В C # есть тип указателя IntPtr. Это тип, используемый для представления указателей / адресов памяти, и это именно то, что вам нужно. Конец истории. Если ваш сломанный компилятор не поддерживает это, тогда задайте правильный вопрос. Не спрашивайте, что поддерживает C #, потому что это явно не имеет значения. Спросите, что поддерживает ваш сломанный компилятор. В C # нет типа указателя, который является указателем для компиляторов, которые не смогли реализовать указатели.   -  person jalf    schedule 25.08.2012


Ответы (1)


Невозможно сделать это на высоком уровне C # без использования Marshal.GetDelegateForFunctionPointer:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CallMeDelegate(int i);

CallMeDelegate del = (CallMeDelegate)Marshal.GetDelegateForFunctionPointer(new IntPtr(0xffff), typeof(CallMeDelegate));

Обратите внимание, что IntPtr не является родным для Windows только из-за своего имени: это типичное значение указателя для текущей цели компиляции (32- или 64-разрядной).

Я думаю, вы не сможете обойтись без этого API, потому что вам нужно указать соглашение о вызовах, чтобы иметь возможность использовать его в обычном синтаксисе делегата C #. Радуйтесь тому факту, что Marshal.GetDelegateForFunctionPointer делает всю грязную работу за вас независимо от платформы!

person Sebastian Graf    schedule 25.08.2012
comment
Что касается последнего комментария OP по вопросу о его компиляторе: игнорируйте мой ответ. Но не проще ли было бы просто реализовать IntPtr в компиляторе? В противном случае вам придется прибегнуть к манипуляции с ASM / регистром, я думаю ... - person Sebastian Graf; 25.08.2012