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

Сообщение Re[13]: .Net Core Вызов виртуальных методов нативных объекто от 17.11.2016 12:52

Изменено 17.11.2016 13:22 Serginio1

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

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


S>> Передавать статические функции или ThisCall трудоемко.

F> Что значит передавать? Откуда-куда?
Из натива в .Net Native вестимо http://rsdn.org/forum/dotnet/6609566.1
Автор: Serginio1
Дата: 14.11.16


S>>Проще общаться с нативом в разные стороны через абстрактные классы

F> Вот как раз и не проще. Иногда проще через очень даже непрозрачные структуры, где клиент и сервер знает её внутренности. Вообще зависит, от того с какой стороны смотреть и/или какие проблемы решаются. Иногда гораздо проще opaque pointer + вся работа только через статические функции (импорты из длл).

F> И тут весь этот бред вокруг IUnknown я считаю лишним абсолютно. Далеко не проще через абстрактные.


F> Я ещё раз делаю акцент: решение зависит только от входящих требований: стабильное ABI, простое, C-совместимое, с или без символическим связыванием имен, пишем ли мы и клиент и сервер и т.п.


S>> Так суть интерфейса это VMT. А классы с виртуальными методами кроссплатформенны.

S>> В 1С это прекрасно работает
F> Мне показалось, что в другой ветке же ж разобрались как можно заставить эту кухню работать?

Да все это работает и на уровне статических методов (ThisCall суть таже). При использовании IUnknown идет куча ненужных вызовов.
Кроме того я хочу эти абстрактные C++ классы с stdcall вызовами использовать в .Net Core
Там мне приходится передавать ссылки на каждый метод.

public static void SetDelegate(IntPtr ДляВыделенияПамяти, IntPtr ДляВызоваОшибки, IntPtr ДляВызоваВнешнегоСобытия)
        {
            ВыделитьПямять = Marshal.GetDelegateForFunctionPointer<ВыделитьПамятьDelegate>(ДляВыделенияПамяти);
            ИнформацияОбОшибке = Marshal.GetDelegateForFunctionPointer<ИнформацияОбОшибкеDelegate>(ДляВызоваОшибки);
            ВнешнееСобытие1С = Marshal.GetDelegateForFunctionPointer<ВнешнееСобытие1СDelegate>(ДляВызоваВнешнегоСобытия);
        }


Конечно можно и по МЬЕ получить адреса методов. Но хотоелось бы аналогов интерфейсов. При этом использовать только ссылку на объект, первым полем которого является ссылка на VMT.
Это просто удобнее при описании и при выполнении.
Re[13]: .Net Core Вызов виртуальных методов нативных объекто
Здравствуйте, fddima, Вы писали:

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


S>> Передавать статические функции или ThisCall трудоемко.

F> Что значит передавать? Откуда-куда?
Из натива в .Net Native вестимо http://rsdn.org/forum/dotnet/6609566.1
Автор: Serginio1
Дата: 14.11.16


S>>Проще общаться с нативом в разные стороны через абстрактные классы

F> Вот как раз и не проще. Иногда проще через очень даже непрозрачные структуры, где клиент и сервер знает её внутренности. Вообще зависит, от того с какой стороны смотреть и/или какие проблемы решаются. Иногда гораздо проще opaque pointer + вся работа только через статические функции (импорты из длл).

F> И тут весь этот бред вокруг IUnknown я считаю лишним абсолютно. Далеко не проще через абстрактные.


F> Я ещё раз делаю акцент: решение зависит только от входящих требований: стабильное ABI, простое, C-совместимое, с или без символическим связыванием имен, пишем ли мы и клиент и сервер и т.п.


S>> Так суть интерфейса это VMT. А классы с виртуальными методами кроссплатформенны.

S>> В 1С это прекрасно работает
F> Мне показалось, что в другой ветке же ж разобрались как можно заставить эту кухню работать?

Да все это работает и на уровне статических методов (ThisCall суть таже). При использовании IUnknown идет куча ненужных вызовов.
Кроме того я хочу эти абстрактные C++ классы с stdcall вызовами использовать в .Net Core
Там мне приходится передавать ссылки на каждый метод.

public static void SetDelegate(IntPtr ДляВыделенияПамяти, IntPtr ДляВызоваОшибки, IntPtr ДляВызоваВнешнегоСобытия)
        {
            ВыделитьПямять = Marshal.GetDelegateForFunctionPointer<ВыделитьПамятьDelegate>(ДляВыделенияПамяти);
            ИнформацияОбОшибке = Marshal.GetDelegateForFunctionPointer<ИнформацияОбОшибкеDelegate>(ДляВызоваОшибки);
            ВнешнееСобытие1С = Marshal.GetDelegateForFunctionPointer<ВнешнееСобытие1СDelegate>(ДляВызоваВнешнегоСобытия);
        }


Конечно можно и по VMT получить адреса методов и через соглашение ThisCall.
Например http://www.cyberforum.ru/post4437036.html


Но хотоелось бы аналогов интерфейсов. При этом использовать только ссылку на объект, первым полем которого является ссылка на VMT.
Это просто удобнее при описании и при выполнении.