#0
by oleg_km
Попробовал вроде все нормально. Попробовал: ТипПорт = объект.GetTypeByStr("System.IO.Ports.SerialPort"); Здесь ругается: Can't resolve type Ругается:
#1
by oleg_km
Точнее: Произошла исключительная ситуация (mscorlib): Could not resolve type 'System.IO.Ports.SerialPort'.
#5
by oleg_km
Теперь возник вопрос с конструктором с параметрами и по поводу использования перечислений: На ТипАдрес.InterNetwork ругается метод не найден, хотя в отладчике виден, в CreateInstance не понятно как передать массив параметров
#6
by oleg_km
Вот вроде должен быть правильный вариант: Но на ТипАдрес.InterNetwork ругается. Автор, подскажи, что не так?
#7
by Serginio1
Ты сначала на шарпе оттести, затем в 1С перенеси. А эта библиотека просто Оле обертка нетовских объектов. Там есть сложности с некоторыми типами но они решаемы Вот последний рабочий вариант
#8
by oleg_km
На шарпе все работает. Проблема судя по всему, что неправильно создается обертка для перечислений (enum), т.к. я сделал тестовый пример, где нужный енум возвращается из шарпа и все заработало: public object Get1 { return new AutoWrap(AddressFamily.InterNetwork); } public object Get2 { return new AutoWrap(SocketType.Stream); } public object Get3 { return new AutoWrap(ProtocolType.Tcp); } Можешь подсказать что добавить в товй компонент, чтобы он правильно обрабатыал перечисления?
#9
by Serginio1
А вообще у InterNetwork значение 2 то есть должно быть мсПарам.SetValue(ТипАдрес, 2);
#11
by Serginio1
не совсем верно это получение значения. Должно работать мсПарам.SetValue(ТипАдрес, 2); так как в рефлекторе InterNetwork = 2
#12
by oleg_km
то есть должно быть мсПарам.SetValue(ТипАдрес, 2); Нет 2 - это же индекс в массиве, еще раз, вот ключевая часть кода: Типы все получены, но получить конкретное перечисление не получается. Я пытался подсунуть массив целых с указанием значений перечислений, но дот нет заругался, что нет такого конструктора (с целыми параметрами), что логично, т.к. шарп не делает неявного приведения.
#16
by oleg_km
Сказал нет такого конструктора А этоя вообще не понял как перевести на 1С. Enum это чей член?
#17
by Serginio1
То есть Активатор.CreateInstance(ТипАдрес, 2) для энума не идет? объект.GetTypeByStr("System.Enum")
#18
by Serginio1
Или сделай метод public object ПолучитьПеречисление(Тип,Предствление) { return new AutoWrap(Enum.ToObject(Тип,Представление); }
#19
by Serginio1
Я в новой версии добавил два метода public object CreateObject(string type) { return new AutoWrap(System.Activator.CreateInstance(Type.GetType(type))); } public object CreateObjectWhithParam(string type,Object[] args) { return new AutoWrap(System.Activator.CreateInstance(Type.GetType(type), args)); }
#21
by oleg_km
Я же писал: так не катит, он потом говорит, не конструктора с типом целый. Ну и в букваре написано, что неявные преобразования целых в перечисления не производятся. Можно наверное попробовать сделать функцию аналог as. типа на входе тип и исходное значение, на выходе объект перечисления. Но я хочу сделать все-таки через имя. Сейчас кухню допылесосю и попробую
#22
by Serginio1
21 Тогда сделай 18. В 20 там установка сПарам.SetValue(2, 0); Установить значение то он даст а вот на вызове обСокет = Активатор.CreateInstance(ТипСокет, мсПарам); саоткнется
#24
by oleg_km
public object ПолучитьПеречисление(Тип,Предствление) { return new AutoWrap(Enum.ToObject(Тип,Представление); } я сделал: public object ПолучитьПеречисление(Тип, string Предствление) { return new AutoWrap(Enum.Parse(Тип, Представление); } а вот какой тип должен иметь Тип. Если Type, то падает в момент вызова неизвестная ошибка, если объект, то падает при приведении
#25
by oleg_km
Все, получилось. Я примерно понял в каком направлении рыть. Съезжу яхту покрашу и вечером попробую сделать финальный вариант.
#26
by Serginio1
не совсем подходит. Там дженерики. По ним отдельная рефлексия public static bool TryParse<TEnum>( string value, out TEnum result ) А 18 не проходит? По идее должен походить для предствления ввиде интов и строк.
#27
by Serginio1
Немного не в тему у Enum есть метод public static object Parse(Type enumType, string value) { } вообще то должен быть Type. Посмотри новый вариант там есть public object ТипКакОбъект(object Тип) { }
#29
by Serginio1
public object ПолучитьМетоды(object Тип) { } То есть в public object ПолучитьПеречисление(object Тип,string Предствление) { return new AutoWrap(Enum.ToObject((Type) Тип,Представление); }
#31
by Serginio1
Либо в ОбернутьОбъект(object obj) добавить if (obj is Type) obj = new AutoWrap((Type)obj);
#32
by Serginio1
Тьфу прошу прощения в новой версии уже есть А вот для передаваемого параметра нужно добавить проверку на тип if (args != null && args.Length > 0) { }
#34
by oleg_km
В общем сделал вот так: public object InvokeMember(string name, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object target, object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo culture, string[] namedParameters) ... Т.е. нужное мне вариант перечисления парсится. Вызов как шарпе: Только у перечисления так же есть методы, которые нужно пропустить в Invoke. Подскажи, как invokeAttr протестировать на наличие флага InvokeMethod, элементарщину пропустил на сях?
#38
by oleg_km
А это для каких случаев нужно? Надышался бензина и краски и что-то голова уже не соображает
#41
by oleg_km
Да понял, добавлю. Это для случая, если мою ссылку на тип нужно будет передать параметром в метод? Так ведь без разницы что передавать, что O что T. Для типа O == T включая тип
#42
by Serginio1
По идее да. Я просто не понял, что у тебя в 24 не получилось. Просто помню с типом боролся, а что и почему уже не помню. public object ПолучитьПеречисление(Type Тип, string Предствление) { return new AutoWrap(Enum.Parse(Тип, Представление); } должен проходить
#43
by oleg_km
public object ПолучитьПеречисление(Type Тип, string Предствление) { return new AutoWrap(Enum.Parse(Тип, Представление); } Это лишнее, лучше как в дополнить public object InvokeMember, чтобы он как шарпе давал выбирать перечисление через точку У меня теперь другая проблема, под 4.0 работает, а хотелось бы под 3.5. Но там ругается не могу загрузить сборку. Позже поразбираюсь - напишу подробности.
#44
by Serginio1
Я не про перечисления. Почему у тебя в 24 а вот какой тип должен иметь Тип. Если Type, то падает в момент вызова неизвестная ошибка, если объект, то падает при приведении А вот для 3.5 нужно и компилировать под 3.5 и соответственно в версию другую указывать не 4.0.0.0
#45
by oleg_km
Я наоборот класс NetObjectToIDispatch максимально разгрузил, оставил только public object GetTypeByStr(string type) { return new AutoWrap(Type.GetType(type, true)); } из него можно все получить и активатор и конструктор массивов:
#46
by Serginio1
Да я непомню уже для чего добавлял методы. Но например public object ВыполнитьМетод(object obj,string ИмяМетода) { if (obj is AutoWrap) } } Специально добавил так как не выполнялся метод ToArray для дженериковского листа не проходил Активатором проще изначальнопользоваться. Масиивом тоже. public object ПолучитьИнтерфейс(object obj, string InterfaseName) { if (obj is AutoWrap) }
#47
by Serginio1
И соответственно 3 конструктора public AutoWrap { } public AutoWrap(object obj) if (O is Type) { } public AutoWrap(object obj, Type type)
#52
by Serginio1
Вообще я эту обертку испольую для простого использования готовых классов. Например для доступа к Вэб сервисам, в тех случаях когда 1С их не понимает. Отдельно описывать все методы через Оле оберку нет смысла когда методов под сотню. И для этих случаев обертка через IReflect самое то. Для использования более специальных обработок проще использовать уже COM классы. Например
#53
by Serginio1
Кстати а DR я использую через Просто пишу COM объект добавляю метод void InitFrom1C(object Object1C); И все public void InitFrom1C(object Object1C) }
#54
by oleg_km
Да я вот тоже, начал писать обертку, вернее у меня есть на С++. Решил переделать на шарп и не хочется все писать на шарпе. Я думаю, где нужны будут события, буду делать спец. обертки, где просто синхронные функции - пользовать универсальную обертку
#55
by Serginio1
Вообще IReflect нужный инструмент. И его легко использовать. Только почему то не очень используемый. Хотя рыбу я взял у писателей сайтов. Кстати нечто аналогичное на уровне динамиков можно делать и для Net через IDynamicObject
#58
by oleg_km
Если бы еще понять как это приспособить. У меня задача такая. С помощью вышеупомянутой обертки например сделал работу с сокетом и ком-портов в синхронном режиме. Но мне кроме того нужно ее и в асинхронном, вернее нужно чтобы в 1С поступали события по аналогии с активИкс. Если можешь накидать простенький пример, как допустим классу SelialPort назначить событие DataReceived, не обязательно работающий пример, можно просто набросок? Не владею глубоко дотНетом, чтобы разобраться
#59
by Serginio1
Тебе нужно ВК писать например public void InitFrom1C(object Object1C) { try } public void ОткрытьАйПиПорт { public void ОткрытьАйПиПортСНомеромПорта(int НомерПорта) { Где private void ОбработкаСоединения(IAsyncResult AsyncCall) private void ВыполнитьКоманду(Socket client) { NetworkStream стрим=new NetworkStream(client); { ДляОбменаПоТСП.ПринятьКоманду(стрим, out команда, out данныеДляКоманды, out ЕстьОтвет); }
#60
by Serginio1
try { } Из 1С доступ к данным через свойство public string ДанныеДляКоманды{get{return данныеДляКоманды;}} так как есть ограничение на строку во третьем параметре. Хотя можно побороть с помощью SetEventBufferDepth но проще доступ из 1С к свойству
#62
by oleg_km
- Да нет так я могу написать и активикс. Мне хочется не писаь код шарпе, а весь код писать в 1С, например: Вот, весь код написан в 1С, не нужно обновлять сборку, перераспространять ее. Один раз установить класс-обертку, а дальше все на стороне 1С. Вот еще добавить как-то создание делегата на базе метода объекта 1С (?) и функцию установить этот делегат событию нужного объекта. Это вообще возможно? Мой уровень познания шарпа не дает возможности оценить.
#63
by Serginio1
Только на обНовыйСокет.Poll 1С будет заморожена. Все же сервер должен работать в ассинхронном режиме. можешь попробовать события
#64
by Serginio1
Ты можешь передать в свою библиотеку общий модуль. Например На Шарпе есть Свойство dinamic Модуль1С {get;set;} Из 1С установи это свойство. ШарпОбъект.Модуль1С=ОбщегоНазначения; Из Шарпа вызывай Модуль1С.ВнешнееСобытие Метод ВнешнееСобытие должен быть в модуле ОбщегоНазначения
#65
by oleg_km
Это мне все понятно, это я уже делал. Но это предполагает необходимость написания кода как в конфигурации 1С, так и в проекте на шарпе. Я же хочу, чтобы проект на шарпе был просто универсальной оберткой и больше не менялся, а весь нужный код, в том числе и дотнетный дописывался на 1С, как .
#66
by Serginio1
А зачем так извращаться то? Сом библиотеку легче написать. Эта обертка хороша для готового класса с использованием кучей классов не использующих ComVisible = true.
#67
by Serginio1
Даже так AutoWrap больше нужен внутри Net что бы выдавать на сторону 1С Idispatch обертку.
#68
by Serginio1
Для делегатов можешь использовать свой сборки с классами специально сгенеренными под задачу, но будет ничем не лучше создания Com библиотеки
#69
by oleg_km
Ну я просто хотел решить организационную задачу: развивать проект, только на стороне кода 1С. А в шарп не лазить вообще. Написать суперуниверсальную обертку и дальше кодить на стороне 1С. Ну нет, так нет. Все равно еще нужно обращение к DLLImport. Поэтому решил для событий сделаю специализированные актисИскы, для DLLImport сделаю спецклассы, все остальное буду дергать через обертку. Всяко легче будет
#70
by Serginio1
Ну можешь конечно посмотреть в сторону CSharpCodeProvider Но это опять ничем не будет лучше чисто нетовских сборок. Но я никак не вижу премущества перед Сом объектом. Но тут уж хозяин барин.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям
В этой группе 1С
- очистить ККМ перед выгрузкой как правильно7
- Поиск по наименованию
- Правое значение в СКД
- 1С web-сервис, проблема с подключением из клиента C# WinRT
- Сколько получает такой аналитик?
- Условное оформление табличной части документа есть ли способ реализовать?
- SQL, 1С Запросы, СКД - Как сделать
- Получить тип значений реквизита справочника по OLE
- По MS SQL подскажите, кто знает
- Заполнение массива XDTO
- v7: Formex. 1С вылетает при установке картинки на динамически созданную кнопку.
- Помогите с лицензированием
- Помогите свернуть базу ПП 1С-Рарус: ТКПТ v8 (08.1.19.03)
- УНФ заказ поставщику на основании заказа на производство
- УФ взять и открыть произвольную форму, что нельзя?
- Как скрыть список пользователей в веб клиенте1С 82
- 1с 7.7 OLE
- C# Компонента в 1Cv77 - отсутствует интерфейс IInitDone
- ПодключитьОбработчикОжидания
- 1с8 (обычная форма): Числовое вычисляемое поле в документе возможно?