Сообщение 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
S>>
_>CallingConvention.Winapi — тот же stdcall
_>CallingConvention.ThisCall — зачем тебе это?
Вот CallingConvention.ThisCall то работает для
S>> Создал функцию для получения адреса метода
S>>
S>>Для интерфеса вроде работает
_>Я вот тут
весь хардкор с Marshal.ReadIntPtr за тебя сделает рантайм.
S>> параметры поменяны местами, а переданное первым параметром значение не соотвествует переданному.
_>Используй stdcall как в native коде, так и в делегате на C#, и все будет норм.
Проблема в том, что ThisCall и stdcall не совместимы.
То есть я должен определить как
_>Здравствуйте, Serginio1, Вы писали:
S>>Попробовал с VMT
S>>Определил методы
_>Вот ты неуемный
_>И если работает — тему можно закрывать, COM-интеропа тебе хватит за глаза.
_>Или ты заради любви к искусству?
И то и другое. Для приведения к интерфейсу при вызове одного метода идет куча QueryInterface Addref,Release
http://rsdn.org/forum/dotnet/6611240.1
Автор: pilgrim_
Дата: 15.11.16
Дата: 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
тебе намекал, а ты сделал вид что понял Дата: 22.06.16
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
S>>
_>CallingConvention.Winapi — тот же stdcall
_>CallingConvention.ThisCall — зачем тебе это?
Вот CallingConvention.ThisCall то работает для
S>> Создал функцию для получения адреса метода
S>>
S>>Для интерфеса вроде работает
_>Я вот тут
весь хардкор с Marshal.ReadIntPtr за тебя сделает рантайм.
S>> параметры поменяны местами, а переданное первым параметром значение не соотвествует переданному.
_>Используй stdcall как в native коде, так и в делегате на C#, и все будет норм.
Проблема в том, что ThisCall и stdcall не совместимы.
То есть я должен определить как
_>Здравствуйте, Serginio1, Вы писали:
S>>Попробовал с VMT
S>>Определил методы
_>Вот ты неуемный
_>И если работает — тему можно закрывать, COM-интеропа тебе хватит за глаза.
_>Или ты заради любви к искусству?
И то и другое. Да ине нужны мне методы IUknown. Я итак передаю нужныю ссылку, а подсчет ссылок если мне нужно организую сам.
Для приведения к интерфейсу при вызове одного метода идет куча QueryInterface Addref,Release
http://rsdn.org/forum/dotnet/6611240.1
Автор: pilgrim_
Дата: 15.11.16
Дата: 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
тебе намекал, а ты сделал вид что понял Дата: 22.06.16
S>> параметры поменяны местами, а переданное первым параметром значение не соотвествует переданному.
_>Используй stdcall как в native коде, так и в делегате на C#, и все будет норм.
Проблема в том, что ThisCall и stdcall не совместимы.
То есть я должен определить как
virtual int execute(int value1, int value2);