Есть ли способ вызвать адрес памяти (например, (void *) f = 0xFFFF;) БЕЗ IntPtr или каких-либо собственных функций Win32. Мне нужно сделать это для исполняемого загрузчика (это для ОС, которая использует проект с открытым исходным кодом под названием COSMOS)
С # недействительный указатель?
Ответы (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
Что касается последнего комментария OP по вопросу о его компиляторе: игнорируйте мой ответ. Но не проще ли было бы просто реализовать IntPtr в компиляторе? В противном случае вам придется прибегнуть к манипуляции с ASM / регистром, я думаю ...
- person Sebastian Graf; 25.08.2012
IntPtr
? Тогда как вы хотите выразить значение указателя? Вы можете использовать переменные типа указателя в небезопасном коде. - person Mohammad Dehghan   schedule 25.08.2012unsafe
блока. (msdn.microsoft.com/en-us /library/y31yhkeb%28v=vs.100%29.aspx и stackoverflow.com/questions/3069448/) - person Jensen   schedule 25.08.2012IntPtr
. Это тип, используемый для представления указателей / адресов памяти, и это именно то, что вам нужно. Конец истории. Если ваш сломанный компилятор не поддерживает это, тогда задайте правильный вопрос. Не спрашивайте, что поддерживает C #, потому что это явно не имеет значения. Спросите, что поддерживает ваш сломанный компилятор. В C # нет типа указателя, который является указателем для компиляторов, которые не смогли реализовать указатели. - person jalf   schedule 25.08.2012