Re[6]: Приоритет вызова перегруженных методов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 07.06.16 14:35
Оценка: 21 (1)
Здравствуйте, Sinix, Вы писали:

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



S>> Я хочу сделать по аналогии с Использование сборок .NET в 1С 7.x b 8.x.

S>А тут не имеет значения, что вы хотите. Важно только то, что поддерживается, т.е. C-style ABIs. Зачатки COM Interop есть, но только под win.
S>Нужно что-то более изощрённое — придётся изобретать магию самому, что требует досконального знания как нативной части, так и кишков маршаллинга CoreCLR. Я, к примеру, за это не возьмусь, т.к. только на поверхностное изучение минимум пару недель придётся потратить.


S>> То есть использование любых сборок из Натива.

S>В общем случае нереально. Не, если ограничиться структурами / делегатами и следить за временем жизни ссылок, то что-то может и получиться, но на "любых сборок" я бы не рассчитывал. Вам точно не достаточно того, что есть в оф.справке, секция "Invoking managed code from unmanaged code"?

Реально. Кратко. Объекты хранятся в массивах. Передаются индексы в массивах. На стороне 1С есть метод
bool CAddInNative::CallAsFunc(const long lMethodNum,
                tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray)
{ 
    return false; 
}


Через IntPtr зная структуры я могу распаковать параметры (Marshal)в том числе и индексы на Объекты. А память для строк byte[] я могу на стороне .Net получив ссылку на метод.
Могу просто все запаковывать в масив.
Меня сейчас просто волнуют приоритеты перегруженных методов. Но могу не заморачиваться пока и выбирать подходящий метод



S>Если что, даже менее амбициозные замашки на c++ выглядят как-то так.


S>> Это все прекрасно работает в Win через COM и InvokeMember. Но есть желание перенести это все на Линукс.

S>Нельзя просто так взять и перенести COM на платформу, которая его не поддерживает. Ваш кэп

Был такой компонет TSocketConnection в Delphi. Суть его в том, что это была замена DCOM. Дам используя IDispatch данные упаковывались в массив. Ссылки на объекты на стороне сервера упаковывались в Idispatch и маршалились обратно. Все это реализуема на уровне собственного маршалинга.

S>>При вызове Метод(1,null) какой метод выбрать?

S>Простой способ: AmbigiousMatchException
S>Сложный способ — подрубаем DLR, как советовал выше
DLR не подходит. Я не знаю заранее, что вызовется. В DLR уже известна сигнатура.

S>>То в Core все через расширения

S>Core как такового нет. Есть RC, которое, как ВНЕЗАПНО выяснилось, несовместимо с 99% существующего кода и невнятные обещания binary compatibility для основных классов BCL, включая reflection.
Ну Method.Invoke(); и


Type T = typeof(string);

var Method = T.GetMethod("Format",new Type[]{ T,  typeof(Object[])});


Работают.
S>Я бы не заморачивался с как минимум до следующего релиза. Если конечно нет желания оседлать хайп и снять все сливки Риски соответствующие.

Ну мне еще C++ нужно изучить, а заодно напишу аналог InvokeMember
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.