Вопрос по NetObjectToIDispatch #664174


#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'.
#2 by Jaap Vduul
дотнет фрэймворк, наверное, старенький...
#3 by oleg_km
Стоит 4, но я так понимаю при запуске подхватилась двойка или как это происходит?
#4 by oleg_km
Спасибо за наводку, вот так заработало:
#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);
#10 by Serginio1
Вернее  Активатор.CreateInstance(ТипАдрес, мсПарам);
#11 by Serginio1
не совсем верно это получение значения. Должно работать мсПарам.SetValue(ТипАдрес, 2); так как в рефлекторе InterNetwork = 2
#12 by oleg_km
то есть должно быть мсПарам.SetValue(ТипАдрес, 2); Нет 2 - это же индекс в массиве, еще раз, вот ключевая часть кода: Типы все получены, но получить конкретное перечисление не получается. Я пытался подсунуть массив целых с указанием значений перечислений, но дот нет заругался, что нет такого конструктора (с целыми параметрами), что логично, т.к. шарп не делает неявного приведения.
#13 by Serginio1
надо будет перечисления посмотретьДа понял Попробуй так
#14 by Serginio1
Тьфу мсПарам.SetValue(Активатор.CreateInstance(ТипАдрес, 2), 0);
#15 by Serginio1
Или object obj1 = Enum.ToObject(ТипАдрес, "InterNetwork");
#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)); }
#20 by Serginio1
А вообще то Энум это чтсло и должно проходить как сПарам.SetValue(2, 0);
#21 by oleg_km
Я же писал: так не катит, он потом говорит, не конструктора с типом целый. Ну и в букваре написано, что неявные преобразования целых в перечисления не производятся. Можно наверное попробовать сделать функцию аналог as. типа на входе тип и исходное значение, на выходе объект перечисления. Но я хочу сделать все-таки через имя. Сейчас кухню допылесосю и попробую
#22 by Serginio1
21 Тогда сделай 18.   В 20 там установка сПарам.SetValue(2, 0); Установить значение то он даст а вот на вызове обСокет = Активатор.CreateInstance(ТипСокет, мсПарам);  саоткнется
#23 by Serginio1
Кстати Enum.ToObject подходит и для чисел
#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 Тип)        {        }
#28 by Serginio1
Непомню зачем тестил объект=Новый COMОбъект("NetObjectToIDispatch");
#29 by Serginio1
public object ПолучитьМетоды(object Тип)        {        } То есть в public object ПолучитьПеречисление(object  Тип,string  Предствление)        {            return new AutoWrap(Enum.ToObject((Type) Тип,Представление);        }
#30 by Serginio1
То есть нужно тип постоянно приводить. Вот такая засада.
#31 by Serginio1
Либо в ОбернутьОбъект(object obj) добавить if (obj is Type) obj = new AutoWrap((Type)obj);
#32 by Serginio1
Тьфу прошу прощения в новой версии уже есть А вот для передаваемого параметра нужно добавить проверку на тип if (args != null && args.Length > 0)            {                }
#33 by zladenuw
и что с этого будет в итоге ? своя обвертка для 1с или че ?
#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, элементарщину пропустил на сях?
#35 by oleg_km
Вот так пока сделал условие:
#36 by oleg_km
Ура, работает:
#37 by Serginio1
Отлично. Но надо еще добить Type в параметрах. см 32
#38 by oleg_km
А это для каких случаев нужно? Надышался бензина и краски и что-то голова уже не соображает
#39 by Serginio1
38 А то что у тебя в 24 не получалось.
#40 by Serginio1
39 + То что в 32 для парпметров
#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)
#48 by oleg_km
Ладно, нужно пробовать. Чуствую, что для полного счастья делегаты еще нужны.
#49 by Serginio1
Нужно смотреть в сторону DynamicAssembly и генерации кода например
#50 by Serginio1
Или посмотреть CodeDOM
#51 by oleg_km
Мда, это по-любому будет означать четверку. В принципе невелика печаль.
#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
#56 by Serginio1
Блин сам забыл System.Delegate.CreateDelegate
#57 by Serginio1
А тип делегата можно получить так
#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С к свойству
#61 by Serginio1
Ну и соответственно если есть ответ public void Ответить(string Ответ)        {
#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С