Информация об изменениях

Сообщение Re[15]: .Net Core Вызов виртуальных методов нативных объекто от 18.11.2016 11:54

Изменено 18.11.2016 12:00 Serginio1

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

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


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

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

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

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

И то и другое. Для приведения к интерфейсу при вызове одного метода идет куча 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);
Re[15]: .Net Core Вызов виртуальных методов нативных объекто
Здравствуйте, 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);