Начну с того, что в 1С есть технология Внешних компонент Native API Технология создания внешних компонент Технология создания внешних компонент которые работают как под Windows так и под Linux
На стороне .Net выполнять метод. Параметры сериализуются в Stream. Сначала идет тип, затем данные.
На стороне .Net Параметры десериализутся и вызывается метод InvokeMember нужного типа. При передаче ссылок на объекты их нужно обернуть и сохранить в списке и в натив передавать индекс в списке.
Так как параметры могут изменяться возвращаем как результат значения, так и параметры.
Таким образом можно загружать любые сборки вызывать любые методы.
Так как я не силен в С++ прошу направить на путь истинный или я могу помочь в интеграции натива и манагед
S>Поделитесь, что смешного?
Сплетающиеся в любовном экстазе русские и английские буквы, совокупляющиеся с рефлекшеном, на фоне которых забывается сам вопрос.
Если без шуток, то код очень грязный и его тяжело читать. А без понимания того что он делает, сложно что-либо советовать. Желание же ковыряться в нём пропадает с первых строк. Понимаю, что общение с 1C накладывает определенный отпечаток, но не стоит тащить из нее все самое плохое.
И, к слову, в чём заключается вопрос? Ты сам привёл ссылку на статью, чем тебя не устраивает вариант с ExecuteManagedAssembly?
Если нужен способ передачи данных, то, вероятно, это MemoryMappedFile. Если не ошибаюсь, MapFileToMem уже поддерживается. Если нет — нативные пайпы.
Здравствуйте, LWhisper, Вы писали:
S>>Поделитесь, что смешного? LW>Сплетающиеся в любовном экстазе русские и английские буквы, совокупляющиеся с рефлекшеном, на фоне которых забывается сам вопрос.
Вопрос про вызов манагед методов из нативаю
LW>Если без шуток, то код очень грязный и его тяжело читать. А без понимания того что он делает, сложно что-либо советовать. Желание же ковыряться в нём пропадает с первых строк. Понимаю, что общение с 1C накладывает определенный отпечаток, но не стоит тащить из нее все самое плохое.
То есть комментарии на русском тебя коробят? Методы на русском это сродни комментариям.
Что касается кода, то это обертка над .Net объектов, для вызова в из натива в виде Idispatch LW>И, к слову, в чём заключается вопрос? Ты сам привёл ссылку на статью, чем тебя не устраивает вариант с ExecuteManagedAssembly? LW>Если нужен способ передачи данных, то, вероятно, это MemoryMappedFile. Если не ошибаюсь, MapFileToMem уже поддерживается. Если нет — нативные пайпы.
Если бы ты почитал поподробнее то увидел бы, как можно сделать вызов static манагед функции из натива.
А значит можно упаковать ссылку (индекс) на объект, имя метода,параметры с типом в Stream и передавать в виде IntPtr в обе стороны.
Понятно, что со стороны натива нужно передать ссылку в манагед на метод выделения памяти.
Сам .Net так и поступает при маршалинге Com объектов. Просто в Linux нет понятия COM и это надо сделать самим.
Но выхлоп заключается в том, что на линуксе из натива можно вызвать любой .Net объект.
В Windos так и делается. Мало того есть компиляция обертки для использования событий .Net классов в нативе через обертку в COM события.
Что касается ссылок, то я в С++ не силен. Кроме того .Net Core сильно меняется с каждой бетта версией
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Sharov, Вы писали:
S>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, Serginio1, Вы писали:
S>>Поделитесь, что смешного?
S>Кириллица.
То есть русский не может писать по русски? Это же обфускация для буржуинов. А пишу то я для 1С овцев, а там все по русски. Даже операторы. Жалко, что на C# нужно переключать клавиатуру.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, xobotik, Вы писали:
X>>Здравствуйте, Serginio1, Вы писали:
S>>>Исходный код обертки можно посмотреть здесь
X>>Напомнило: http://rsdn.ru/article/humor/select_problem.xml
X>>А так спасибо поржал =) Особенно http://pastebin.com/x4m4D2EZ S> Ты хоть поясни, что тебе напомнило, и где смеяться, и что нужно употребить?
Почитай https://msdn.microsoft.com/ru-ru/library/ff926074.aspx!
Обычно есть стандарт кодирования, которым придерживаются при разработке базовой библиотеки для какого-либо языка.
Обычно, если ты пишешь допустим на C++ и используешь Qt Framework, пишешь используя стандарт кодирования Qt Framework.
Если ты пишешь на C# и используешь .NET Framework, пишешь используя стандарт кодирования .NET Framework.
Если ты пишешь под 1C, не знаю какой там стандарт =) Но наверно какой-то есть =)
Здравствуйте, xobotik, Вы писали:
X>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, xobotik, Вы писали:
X>>>Здравствуйте, Serginio1, Вы писали:
S>>>>Исходный код обертки можно посмотреть здесь
X>>>Напомнило: http://rsdn.ru/article/humor/select_problem.xml
X>>>А так спасибо поржал =) Особенно http://pastebin.com/x4m4D2EZ S>> Ты хоть поясни, что тебе напомнило, и где смеяться, и что нужно употребить?
X>Почитай https://msdn.microsoft.com/ru-ru/library/ff926074.aspx! X>Обычно есть стандарт кодирования, которым придерживаются при разработке базовой библиотеки для какого-либо языка. X>Обычно, если ты пишешь допустим на C++ и используешь Qt Framework, пишешь используя стандарт кодирования Qt Framework. X>Если ты пишешь на C# и используешь .NET Framework, пишешь используя стандарт кодирования .NET Framework. X>Если ты пишешь под 1C, не знаю какой там стандарт =) Но наверно какой-то есть =)
И чем тебе мой код смешон? Я стараюсь придерживаться приведенного тобой стандарта.
и солнце б утром не вставало, когда бы не было меня
S> То есть русский не может писать по русски? Это же обфускация для буржуинов. А пишу то я для 1С овцев, а там все по русски. Даже операторы. Жалко, что на C# нужно переключать клавиатуру.
В домашнем проекте ты можешь писать так, как тебе нравится.
Локализованная 1C пошла путём Excel'я и обязывает писать на русском.
Но использовать кириллицу вместе с латиницей, доводя ситуацию до абсурда (МетодObject) — это плохая затея.
Как я уже писал, код невозможно читать. Это вовсе не отторжение к родному языку, и в комментариях он вполне имеет право на жизнь, но в таком виде это обфускация для любого программиста, сродни write-only коду.
Серьёзно, друг, перечитай своё сообщение. Даже твои посты на форуме невозможно читать, не говоря уже о коде.
Это какой-то поток мыслеобразов, которые понятны лишь тебе.
S> Если бы ты почитал поподробнее то увидел бы, как можно сделать вызов static манагед функции из натива. S>А значит можно упаковать ссылку (индекс) на объект, имя метода,параметры с типом в Stream и передавать в виде IntPtr в обе стороны. S>Понятно, что со стороны натива нужно передать ссылку в манагед на метод выделения памяти. S>Сам .Net так и поступает при маршалинге Com объектов. Просто в Linux нет понятия COM и это надо сделать самим. S>Но выхлоп заключается в том, что на линуксе из натива можно вызвать любой .Net объект. S>В Windos так и делается. Мало того есть компиляция обертки для использования событий .Net классов в нативе через обертку в COM события. S> Что касается ссылок, то я в С++ не силен. Кроме того .Net Core сильно меняется с каждой бетта версией
Я честно пытался прочитать и предыдущий твой пост и этот. Ответа на вопрос — чем тебя не устраивает предложенное в статье решение я не нашёл.
Ты хочешь шарить .NET объекты в виде интерфейсов неявным образом, по образу и подобию COM-объектов? Зачем? Это устаревшая технология, которой на замену давно пришёл C++/CLI. В этом случае стоит посмотреть в сторону CLang, если тебе нужно направление в котором стоит копать. Или ты ищешь готовое решение из коробки? Тебе сюда: https://github.com/Marqin/simpleCoreCLRHost
Здравствуйте, LWhisper, Вы писали:
S>> То есть русский не может писать по русски? Это же обфускация для буржуинов. А пишу то я для 1С овцев, а там все по русски. Даже операторы. Жалко, что на C# нужно переключать клавиатуру. LW>В домашнем проекте ты можешь писать так, как тебе нравится. LW>Локализованная 1C пошла путём Excel'я и обязывает писать на русском. LW>Но использовать кириллицу вместе с латиницей, доводя ситуацию до абсурда (МетодObject) — это плохая затея. LW>Как я уже писал, код невозможно читать. Это вовсе не отторжение к родному языку, и в комментариях он вполне имеет право на жизнь, но в таком виде это обфускация для любого программиста, сродни write-only коду.
Ты плохо понимаешь по русски? То есть в комметариях имеет, а в названиях нет?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, LWhisper, Вы писали:
LW>Серьёзно, друг, перечитай своё сообщение. Даже твои посты на форуме невозможно читать, не говоря уже о коде. LW>Это какой-то поток мыслеобразов, которые понятны лишь тебе.
S>> Если бы ты почитал поподробнее то увидел бы, как можно сделать вызов static манагед функции из натива. S>>А значит можно упаковать ссылку (индекс) на объект, имя метода,параметры с типом в Stream и передавать в виде IntPtr в обе стороны. S>>Понятно, что со стороны натива нужно передать ссылку в манагед на метод выделения памяти. S>>Сам .Net так и поступает при маршалинге Com объектов. Просто в Linux нет понятия COM и это надо сделать самим. S>>Но выхлоп заключается в том, что на линуксе из натива можно вызвать любой .Net объект. S>>В Windos так и делается. Мало того есть компиляция обертки для использования событий .Net классов в нативе через обертку в COM события. S>> Что касается ссылок, то я в С++ не силен. Кроме того .Net Core сильно меняется с каждой бетта версией LW>Я честно пытался прочитать и предыдущий твой пост и этот. Ответа на вопрос — чем тебя не устраивает предложенное в статье решение я не нашёл. LW>Ты хочешь шарить .NET объекты в виде интерфейсов неявным образом, по образу и подобию COM-объектов? Зачем? Это устаревшая технология, которой на замену давно пришёл C++/CLI. В этом случае стоит посмотреть в сторону CLang, если тебе нужно направление в котором стоит копать. Или ты ищешь готовое решение из коробки? Тебе сюда: https://github.com/Marqin/simpleCoreCLRHost
Кстати эта ссылка есть и в моих http://forums.dotnetfoundation.org/t/how-to-call-a-net-core-library-from-native-code-on-linux/1576/2
И This C++ app allows to run custom C# method from compiled C# .dll on Linux and OS X using coreCLR
1C под Win понимает только COM. И очень удобно расширять её возможности с помощью COM обертки вокруг .Net объектов.
Для кроссплатформенности введен Native ВК
Для Линукс нужно сделать аналог, с обменом данных между нативом и .Net по аналогии с IDispatch.
За ссылку спасибо. Сейчас изучаю С++. Но времени мало.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> И чем тебе мой код смешон? Я стараюсь придерживаться приведенного тобой стандарта. Противоречит одному из пунктов:
Предоставление читателям возможности делать предположения, основанные на опыте, и поэтому быстрее понимать код.
Это не потому что мы не любим русский язык, а потому что этот код тяжело читать и с ним трудно работать. C# позволяет использовать символы другого языка в идентификаторах, но делать это строго не рекомендуется. Ты сам писал про необходимость переключать язык. А у меня есть знакомый, который использует европейские умлауты в именах полей и методов. И вот как мне их вводить, с EN/RU раскладкой? А если с твоим кодом придётся работать человеку, у которого EN/FR раскладка? И это только касательно удобства. Как я писал ранее. подобная мешанина затрудняет чтение и хочется скорее закрыть документ, а не разбираться в том, что там происходит.
Здравствуйте, Serginio1, Вы писали:
S> Ты плохо понимаешь по русски? То есть в комметариях имеет, а в названиях нет?
"По-русски". Да, совершенно верно. В идентификаторах не стоит использовать символы, отличные от нижней ASCII.
Здравствуйте, LWhisper, Вы писали:
LW>Здравствуйте, Serginio1, Вы писали:
S>> И чем тебе мой код смешон? Я стараюсь придерживаться приведенного тобой стандарта. LW>Противоречит одному из пунктов: LW>
LW>Предоставление читателям возможности делать предположения, основанные на опыте, и поэтому быстрее понимать код.
LW>Это не потому что мы не любим русский язык, а потому что этот код тяжело читать и с ним трудно работать. C# позволяет использовать символы другого языка в идентификаторах, но делать это строго не рекомендуется. Ты сам писал про необходимость переключать язык. А у меня есть знакомый, который использует европейские умлауты в именах полей и методов. И вот как мне их вводить, с EN/RU раскладкой? А если с твоим кодом придётся работать человеку, у которого EN/FR раскладка? И это только касательно удобства. Как я писал ранее. подобная мешанина затрудняет чтение и хочется скорее закрыть документ, а не разбираться в том, что там происходит.
С моим кодом пока работаю только я один. А я 1С ник. И мне удобнее работать с киррилицей.
К хорошему привыкаешь быстро. Попробуй
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, LWhisper, Вы писали:
LW>Здравствуйте, Serginio1, Вы писали:
S>> Ты плохо понимаешь по русски? То есть в комметариях имеет, а в названиях нет? LW>"По-русски". Да, совершенно верно. В идентификаторах не стоит использовать символы, отличные от нижней ASCII.
Я пишу для 1С ников. А им методы нужны по русски. Они наоборот плюются на ASCII.
Там в большинстве по русски методы COM. Так что все должно быть в едином стиле.
Скоро и вы доживете до Юникоде
и солнце б утром не вставало, когда бы не было меня
static void GenericTypeDemo(Args _args)
{
ClrObject o = new ClrObject(“System.Collections.Generic.List`1[System.Int32]”);
ClrObject enumerator;
int theValue;
// o is an instance of an IEnumerable<int>
o.Add(1);
o.Add(4);
o.Add(12);
print o.ToString();
enumerator = o.GetEnumerator();
while (enumerator.MoveNext())
{
theValue = enumerator.get_Current();
print theValue;
}
pause;
}
Странно, что 1С сама не хочет использовать .Net в 1С
и солнце б утром не вставало, когда бы не было меня
С Текущей ВК к сожалению придется делать обертку на двоичных данных, что бы в них устанавливать свою структуру для того, что бы понять что это за объект. При получении такого объекта на стороне 1С нужно создать ВК обертку и передать эту структуру. Внутри уже вызывать методы используя ссылку.
При передачи в параметрах такой структуры, нужно получать ссылку и передавать уже на сторону .Net. Можно обойтись и просто ссылкой, но тогда при передаче параметров будет непонятно, что это ссылка. БинарныеДанные тоже придется упаковывать в эту структуру.
Можно конечно использовать информацию о методе, так как так или иначе нужно передавать в GetNParams количество параметров. Но в .Net есть перегрузка методов где параметр может быть и интом и объектом
Пример будет выглядеть так
Врап=Новый("Addin.VK.WrapperNet");
Список=Новый("Addin.VK.NetObject");
Данные=Врап.СоздатьОбъект("System.Collections.Generic.List`1[System.String]");
Список.Обернуть(Данные);
Для сч=1 По 10 Цикл
Список.Add(строка(сч));
КонецЦикла;
Ну и Данные можно передавать в параметрах.
В Native BK есть базовый класс с виртуальными методами
IComponentBase
bool Init(void* pConnection)
long GetInfo()
void Done()
bool RegisterExtensionAs(WCHAR_T** wsLanguageExt)
long GetNProps()
long FindProp(const WCHAR_T* wsPropName)
const WCHAR_T* GetPropName(long lPropNum, long lPropAlias)
bool GetPropVal(const long lPropNum, tVariant* pvarPropVal)
bool SetPropVal(const long lPropNum, tVariant* varPropVal)
bool IsPropReadable(const long lPropNum)
bool IsPropWritable(const long lPropNum)
long GetNMethods()
long FindMethod(const WCHAR_T* wsMethodName)
const WCHAR_T* GetMethodName(const long lMethodNum,
const long lMethodAlias)
long GetNParams(const long lMethodNum)
bool GetParamDefValue(const long lMethodNum, const long lParamNum,
tVariant *pvarParamDefValue)
bool HasRetVal(const long lMethodNum)
bool CallAsProc(const long lMethodNum,
tVariant* paParams, const long lSizeArray)
bool CallAsFunc(const long lMethodNum,
tVariant* pvarRetValue, tVariant* paParams, const long lSizeArray)
void SetLocale(const WCHAR_T* loc)
bool setMemManager(void* mem)