Re[14]: .Net Core Вызов виртуальных методов нативных объекто
От: pilgrim_ Россия  
Дата: 18.11.16 11:21
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Попробовал с VMT

S>Определил методы

Вот ты неуемный ты бы для начала проверил, работает ли COM-интероп на linux — ведь это же твоя цель?
И если работает — тему можно закрывать, COM-интеропа тебе хватит за глаза.
Или ты заради любви к искусству?

S>
S>        [UnmanagedFunctionPointer(CallingConvention.Winapi)]
S>        internal delegate void ВиртуальныйМетодОбъектаСDelegate(IntPtr self, int Число);

S>        [UnmanagedFunctionPointer(CallingConvention.ThisCall)]
S>        internal delegate void ВиртуальныйМетодОбъекта2Delegate(IntPtr self, int Число1, int Число2);
S>


CallingConvention.Winapi — тот же stdcall
CallingConvention.ThisCall — зачем тебе это?


S> Создал функцию для получения адреса метода


S>
S>   public static IntPtr ПолучитьАдресВиртуальногоМетода(IntPtr Объект, int ИндексВТаблицеВиртуальныхМетодов )
S>        {
S>            int размерIntPtr = Marshal.SizeOf<IntPtr>();

S>            // Первым полем объекта идет ссылка на VMT
S>            // Прочитаем её
S>            var АдресVMT = Marshal.ReadIntPtr(Объект);
S>            //  получим адресс метода по смещению в VMT
S>            var АдресМетодаVMT = АдресVMT + ИндексВТаблицеВиртуальныхМетодов * размерIntPtr;
S>            var АдресМетода = Marshal.ReadIntPtr(АдресМетодаVMT);

S>            return АдресМетода;
S>        }


S>Для интерфеса вроде работает


Я вот тут
Автор: pilgrim_
Дата: 22.06.16
тебе намекал, а ты сделал вид что понял весь хардкор с Marshal.ReadIntPtr за тебя сделает рантайм.

S> параметры поменяны местами, а переданное первым параметром значение не соотвествует переданному.


Используй stdcall как в native коде, так и в делегате на C#, и все будет норм.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.