.Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.11.16 13:37
Оценка:
Возможно ли вызвать виртуальные методы С++ классов из .Net Core.

Я могу вызвать статические и объектные методы через
Marshal.GetDelegateForFunctionPointer с

[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
или
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
например

https://github.com/Marqin/simpleCoreCLRHost/blob/master/Managed.cs

Можно ли в .Net Core использовать
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)

Или другой интерфейс для доступа к виртуальным методам С++ класса, без методов IUncknown напрямую?

Да и как там в .Net Core C++/CLI ?
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.11.2016 13:53 Serginio1 . Предыдущая версия .
Re: .Net Core Вызов виртуальных методов нативных объектов
От: rm822 Россия  
Дата: 12.11.16 19:40
Оценка: +1
Короткий ответ — нет.
Ты и в обычном .net их толком не вызовешь без type library или IDispatch потому что
а) для вирт. метода нужно знать индекс в таблице вируальных функций
б) этих таблиц может быть несколько, и надо знать индекс таблицы
в) данные базового класса могут иметь смещение и его тоже нужно знать

Извраты есть, но о них рассказывать нет никакого желания, потому что гомосятина
Re[2]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.11.16 21:02
Оценка:
Здравствуйте, rm822, Вы писали:

R>Короткий ответ — нет.

R>Ты и в обычном .net их толком не вызовешь без type library или IDispatch потому что
R>а) для вирт. метода нужно знать индекс в таблице вируальных функций
Ну так описывая класс виртуальными методами мы и описываем VMT
По сути это ничем не отличается от IUnknown
R>б) этих таблиц может быть несколько, и надо знать индекс таблицы
Это как? Интерфейсы и множественное наследование не рассматриваем. Только VMT. При этом на С++ нет проблем их использовать.
R>в) данные базового класса могут иметь смещение и его тоже нужно знать
Данные не интересуют. Интересуют только объект первым полем является ссылка на VMT.
И описание этой VMT на C#. И почему это не сделать для совместимости в .Net Core c нативным кодом?

А контракт можно прописать как то так

[InterfaceType(NativeInterfaceType.VMT)]
interface ICallback
{
    void execute();
}
и солнце б утром не вставало, когда бы не было меня
Отредактировано 13.11.2016 6:23 Serginio1 . Предыдущая версия . Еще …
Отредактировано 12.11.2016 21:13 Serginio1 . Предыдущая версия .
Отредактировано 12.11.2016 21:13 Serginio1 . Предыдущая версия .
Re: .Net Core Вызов виртуальных методов нативных объектов
От: turbocode  
Дата: 12.11.16 21:54
Оценка:
S> Или другой интерфейс для доступа к виртуальным методам С++ класса, без методов IUncknown напрямую?

Нет, нужно завернуть С++ в COM библиотеку.
Re[2]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 06:20
Оценка:
Здравствуйте, turbocode, Вы писали:

S>> Или другой интерфейс для доступа к виртуальным методам С++ класса, без методов IUncknown напрямую?


T>Нет, нужно завернуть С++ в COM библиотеку.

Для .Net Core пойдет?
и солнце б утром не вставало, когда бы не было меня
Re[3]: .Net Core Вызов виртуальных методов нативных объектов
От: turbocode  
Дата: 13.11.16 08:26
Оценка:
T>>Нет, нужно завернуть С++ в COM библиотеку.
S> Для .Net Core пойдет?

Думаю что пойдет при условии что ты согласен потерять переносимость.
Re: .Net Core Вызов виртуальных методов нативных объектов
От: α Российская Империя  
Дата: 13.11.16 09:06
Оценка: 10 (1)
Здравствуйте, Serginio1, Вы писали:

S> Возможно ли вызвать виртуальные методы С++ классов из .Net Core.


В мсдн пишут что в принципе можно, но саму структуру классов с++ надо заранее проектировать под интеграцию с .net. Для остальных случаев рекомендуют оборачивать общение с классами с++ в с-api
Re[4]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 10:03
Оценка:
Здравствуйте, turbocode, Вы писали:

T>>>Нет, нужно завернуть С++ в COM библиотеку.

S>> Для .Net Core пойдет?

T>Думаю что пойдет при условии что ты согласен потерять переносимость.

нет мне нужна кроссплатформенность. На самом деле
interface ICLRRuntimeHost2 : ICLRRuntimeHost


Кроссплатформенный.
https://github.com/dotnet/coreclr/blob/32f0f9721afb584b4a14d69135bea7ddc129f755/src/inc/MSCOREE.IDL


Посмотрю потддерживает ли .Net Core
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
и солнце б утром не вставало, когда бы не было меня
Re[2]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 10:05
Оценка:
Здравствуйте, α, Вы писали:

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


S>> Возможно ли вызвать виртуальные методы С++ классов из .Net Core.


α>В мсдн пишут что в принципе можно, но саму структуру классов с++ надо заранее проектировать под интеграцию с .net. Для остальных случаев рекомендуют оборачивать общение с классами с++ в с-api


Мне как раз и нужно вызывать нативные методы из .Net

Кроссплатформенное использование классов .Net из неуправляемого кода. Или аналог IDispatch на Linux
и солнце б утром не вставало, когда бы не было меня
Re[5]: .Net Core Вызов виртуальных методов нативных объектов
От: turbocode  
Дата: 13.11.16 11:18
Оценка:
S> нет мне нужна кроссплатформенность. На самом деле
S>
S>interface ICLRRuntimeHost2 : ICLRRuntimeHost
S>

S> Кроссплатформенный.
S>https://github.com/dotnet/coreclr/blob/32f0f9721afb584b4a14d69135bea7ddc129f755/src/inc/MSCOREE.IDL
S> Посмотрю потддерживает ли .Net Core
S>
S>[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
S>


А чем тебе это поможет?
Я не слышал чтобы в .Net Core была возможность создавать кроссплатформенные COM объекты (да и еще на С++). P.S. Было бы неплохо конечно, но думаю этого мы никогда не дождемся.
Re[6]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 11:27
Оценка:
Здравствуйте, turbocode, Вы писали:

S>> нет мне нужна кроссплатформенность. На самом деле

S>>
S>>interface ICLRRuntimeHost2 : ICLRRuntimeHost
S>>

S>> Кроссплатформенный.
S>>https://github.com/dotnet/coreclr/blob/32f0f9721afb584b4a14d69135bea7ddc129f755/src/inc/MSCOREE.IDL
S>> Посмотрю потддерживает ли .Net Core
S>>
S>>[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
S>>


T>А чем тебе это поможет?

T>Я не слышал чтобы в .Net Core была возможность создавать кроссплатформенные COM объекты (да и еще на С++). P.S. Было бы неплохо конечно, но думаю этого мы никогда не дождемся.

Так суть COM это VMT. А она по сути кроссплатформенна.
А вот насчет кроссплатформенного использования ICLRRuntimeHost2 то здесь https://github.com/Marqin/simpleCoreCLRHost/blob/master/simpleCoreCLRHost.cpp

используют статические функции

хотя можно и так
http://www.fancy-development.net/hosting-net-core-clr-in-your-own-process
и солнце б утром не вставало, когда бы не было меня
Re[7]: .Net Core Вызов виртуальных методов нативных объектов
От: turbocode  
Дата: 13.11.16 11:58
Оценка:
S> Так суть COM это VMT. А она по сути кроссплатформенна.

С каких это пор? Можно примеры таких С++ COM объектов?
P.S. Я не спорю что MS мог для своих нужд это сделать, но для общего использования ничего подобного нету.
Re[8]: .Net Core Вызов виртуальных методов нативных объектов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 12:55
Оценка:
Здравствуйте, turbocode, Вы писали:

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


T>С каких это пор? Можно примеры таких С++ COM объектов?

T>P.S. Я не спорю что MS мог для своих нужд это сделать, но для общего использования ничего подобного нету.

Ну я тебе показал ICLRRuntimeHost2.
Так суть интерфейса это VMT. А классы с виртуальными методами кроссплатформенны.
В 1С это прекрасно работает

class IInitDoneBase
{
public:
    virtual ~IInitDoneBase() {}
    /// Initializes component
    /**
     *  @param disp - 1C:Enterpise interface
     *  @return the result of
     */
    virtual bool ADDIN_API Init(void* disp) = 0;
    /// Sets the memory manager
    /*
     * @param mem - pointer to memory manager interface.
     *  @return the result of
     */
    virtual bool ADDIN_API setMemManager(void* mem) = 0;

    /// Returns component version
    /**
     *  @return - component version (2000 - version 2)
     */
    virtual long ADDIN_API GetInfo() = 0;

    /// Uninitializes component
    /**
     *  Component here should release all consumed resources.
     */
    virtual void ADDIN_API Done() = 0;

};
///////////////////////////////////////////////////////////////////////////
/**
 *  The given interface defines methods that are intented to be used by the Platform
 */
/// Interface describing extension of language.



где

#ifndef  ADDIN_API
#ifndef __linux__
#define ADDIN_API __stdcall
#else
//#define ADDIN_API __attribute__ ((__stdcall__))
#define ADDIN_API
#endif //__linux__
#endif //ADDIN_API
и солнце б утром не вставало, когда бы не было меня
Re[9]: .Net Core Вызов виртуальных методов нативных объектов
От: turbocode  
Дата: 13.11.16 13:21
Оценка:
S> Ну я тебе показал ICLRRuntimeHost2.
Это внутренности, для себя MS может сделать какой то кроссплатформенный обрубок COM, но это не значит что ты сможешь этим воспользоваться.

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

S> В 1С это прекрасно работает

[example skiped]

Не знаю что там в 1С но в твоем примере COM-ом и не пахнет.
Re[10]: .Net Core Вызов виртуальных методов нативных объекто
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 14:08
Оценка:
Здравствуйте, turbocode, Вы писали:



T>Не знаю что там в 1С но в твоем примере COM-ом и не пахнет.

COM это те же виртуальные методы. Та же VMT (vtbl).

https://msdn.microsoft.com/ru-ru/library/5hhehwba.aspx
http://www.developing.ru/com/iunknown.html
и солнце б утром не вставало, когда бы не было меня
Отредактировано 13.11.2016 14:45 Serginio1 . Предыдущая версия .
Re[11]: .Net Core Вызов виртуальных методов нативных объекто
От: turbocode  
Дата: 13.11.16 15:04
Оценка:
T>>Не знаю что там в 1С но в твоем примере COM-ом и не пахнет.
S> COM это те же виртуальные методы. Та же VMT (vtbl).
S>https://msdn.microsoft.com/ru-ru/library/5hhehwba.aspx
S>http://www.developing.ru/com/iunknown.html

И чем тебе это поможет? Инструмента создавать кроссплатформенные С++ COM объекты нету так как MFC/ATL не кроссплатформенны.
Re[12]: .Net Core Вызов виртуальных методов нативных объекто
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 15:09
Оценка:
Здравствуйте, turbocode, Вы писали:

T>>>Не знаю что там в 1С но в твоем примере COM-ом и не пахнет.

S>> COM это те же виртуальные методы. Та же VMT (vtbl).
S>>https://msdn.microsoft.com/ru-ru/library/5hhehwba.aspx
S>>http://www.developing.ru/com/iunknown.html

T>И чем тебе это поможет? Инструмента создавать кроссплатформенные С++ COM объекты нету так как MFC/ATL не кроссплатформенны.


VMT кроссплатформенна. Мне не нужен COM как таковой. Мне нужен контракт на основе VMT между нативным и манагед кодом
и солнце б утром не вставало, когда бы не было меня
Re[13]: .Net Core Вызов виртуальных методов нативных объекто
От: turbocode  
Дата: 13.11.16 15:18
Оценка:
S>VMT кроссплатформенна. Мне не нужен COM как таковой. Мне нужен контракт на основе VMT между нативным и манагед кодом

Не будет COM-а не будет и контракта, точнее бинарной совместимости. Но если тебе не нужно строить объектные модели то как сказали тебе ниже сделай себе сишную обертку и не парся.
Re[14]: .Net Core Вызов виртуальных методов нативных объекто
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.16 16:43
Оценка:
Здравствуйте, turbocode, Вы писали:

S>>VMT кроссплатформенна. Мне не нужен COM как таковой. Мне нужен контракт на основе VMT между нативным и манагед кодом


T>Не будет COM-а не будет и контракта, точнее бинарной совместимости. Но если тебе не нужно строить объектные модели то как сказали тебе ниже сделай себе сишную обертку и не парся.


В топике я и так использую
Marshal.GetDelegateForFunctionPointer

с
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]

или
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]


Интересно существует ли возможность использовать интерфейсы или виртуальные методы?
По сути то это несложно если соблюдать тип вызова и VMT
Я и не особо парюсь.
и солнце б утром не вставало, когда бы не было меня
Re[15]: .Net Core Вызов виртуальных методов нативных объекто
От: turbocode  
Дата: 13.11.16 17:26
Оценка: 10 (1)
S> Интересно существует ли возможность использовать интерфейсы или виртуальные методы?
Напрямую нет, только: 1. С-style обертка; 2. COM; 3. грязный хак;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.