Re[15]: .Net Core Вызов виртуальных методов нативных объекто
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.11.16 11:54
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Здравствуйте, Serginio1, Вы писали:


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

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

_>Вот ты неуемный ты бы для начала проверил, работает ли COM-интероп на linux — ведь это же твоя цель?

_>И если работает — тему можно закрывать, COM-интеропа тебе хватит за глаза.
_>Или ты заради любви к искусству?

И то и другое. Да ине нужны мне методы IUknown. Я итак передаю нужныю ссылку, а подсчет ссылок если мне нужно организую сам.

Для приведения к интерфейсу при вызове одного метода идет куча QueryInterface Addref,Release
http://rsdn.org/forum/dotnet/6611240.1
Автор: pilgrim_
Дата: 15.11.16


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 — зачем тебе это?


Вот CallingConvention.ThisCall то работает для

struct TestThisCall {
    public:
        virtual int  execute(int value1, int value2);

    };




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#, и все будет норм.


Проблема в том, что ThisCall и stdcall не совместимы.
То есть я должен определить как
virtual int  execute(int value1, int value2);
и солнце б утром не вставало, когда бы не было меня
Отредактировано 18.11.2016 12:00 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.