Здравствуйте, 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