|
Динамическая компиляция для использования .Net событий в 1С | ☑ | ||
---|---|---|---|---|
0
Serginio1
12.11.15
✎
15:15
|
Выложил статью .NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия
http://catalog.mista.ru/public/417830/ Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры на использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать сборки .Net только на языке 1С. Эта статья является дополнением разработки Использование сборок .NET в 1С 7.x b 8.x находящейся здесь http://catalog.mista.ru/public/238584/ v8: v8: Использование сборок .NET в 1С 7.x и 8.x |
|||
274
Serginio1
04.12.15
✎
14:06
|
Кстати можно выполнять скрипты на IronPython
http://metanit.com/sharp/tutorial/9.3.php |
|||
275
MM
04.12.15
✎
14:10
|
(274) это добро отдельно ставить надо?
Кстати в чистой вин7 сп1 нету NET.4 ( |
|||
276
Serginio1
04.12.15
✎
14:17
|
(275) Ну DDL то нужна.
Сейчас уже .Net 4.6.1 https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx |
|||
277
Serginio1
04.12.15
✎
14:20
|
||||
278
MM
04.12.15
✎
14:29
|
Чего в этой компоненте не хватает, так это полноценного инсталятора, который сам запросит элевацию, зарегистрирует 32 и 64 COM и выкачает и поставит подходящий НЕТ, если его нет.
Не плохо бы msi, для доменной установки. |
|||
279
Masquerade
04.12.15
✎
14:42
|
(272)
-- А мне уже без них вообще не обойтись. Это от небольшого ума. |
|||
280
Музон Хиггса
04.12.15
✎
14:43
|
(274) Если кому-то захочется, тогда уж лучше так: https://github.com/mrprint/OnePy
|
|||
281
kyvv
04.12.15
✎
14:45
|
(279)На Мисте выяснили, что его вообще нет.
|
|||
282
kyvv
04.12.15
✎
14:49
|
(278) Согласен. Должна быть одна большая кнопка.
|
|||
283
Serginio1
04.12.15
✎
14:51
|
(278) Надо будет сделать на досуге. https://msdn.microsoft.com/ru-ru/library/ms173084(v=vs.90).aspx
Но посмотри на количество скачавших. (280) А чем лучше? (279) А как использовать, то чего в 1С нет? |
|||
284
kyvv
04.12.15
✎
14:54
|
Программисты что-то подобное давно используют, для остальных - неподъемный груз.
|
|||
285
MM
04.12.15
✎
14:56
|
(282) после нажатия на эту кнопку, остальное уже от разработчика конфигурации зависеть будет. Эта компонента не для пользователя.
|
|||
286
oleg_km
04.12.15
✎
14:56
|
(283)
>> (279) А как использовать, то чего в 1С нет? А применить к данному случаю Евангелие от Матфея гл.7 стих 6. Он все равно ничего не поймет, т.к. мнит себя большим умом |
|||
287
Музон Хиггса
04.12.15
✎
14:57
|
(283) > А чем лучше?
Более тесной интеграцией. |
|||
288
Serginio1
04.12.15
✎
15:03
|
(287) Там даже ReadMe нет. Посмотрел внутренности обертка через ВК.
А используя NetObjectToIDispatch45 и ExpandoObject делай, что угодно. Тем более, что Scripting API помощнее будет (266) |
|||
289
Музон Хиггса
04.12.15
✎
15:06
|
(288) Там и Python кода нет (публиковалось одноразово для потенциального работодателя). Затачивалось под совместимость с XP и 7.7. Потому и так.
|
|||
290
Serginio1
04.12.15
✎
15:21
|
(289) Я понял, что библиотека аналогичная Elisy.NetBridge4 только для выполнения кода питона.
NetObjectToIDispatch20 тоже работает с 2.0 и 7.7. Только я на неё честно говоря наплевал. Так напиши хотя бы ReadME думаю многих заинтересует кто знает питоновские библиотеки. Опубликуй статью на Инфостарте. |
|||
291
kyvv
04.12.15
✎
15:30
|
«Peter Gribanov, Technology evangelist in 1C». Статью на хабре здесь уже приводили (http://habrahabr.ru/company/1c/blog/267321/). В этой статье он сравнивает ЯР1С с JavaScript. Я вот и подумал, а не хочет ли 1С заменить свой язык на js? Или на Dart. V8 в 1С и у google. А если еще Nodejs присобачить.
|
|||
292
Masquerade
04.12.15
✎
15:34
|
(283)
-- А как использовать, то чего в 1С нет? Ты не поверишь, но лично я поступаю так: Беру другой инструмент/платформу и решаю задачу на ней. |
|||
293
Masquerade
04.12.15
✎
15:35
|
+
Зачем тащить в среду противоестественные для неё штуки? А потом решать связанные с этим проблемы, которые (поверьте) лежат даже не области кода. |
|||
294
Serginio1
04.12.15
✎
15:35
|
(291) Лучше TypeScript. Но есть куча трансляторов из манагед кода (.Net,Java) кода в JS для Вэб клиента.
(292) Ну и чем это лучше чем из 1С использовать классы .Net. Ты 1С интегрируешь через COM? |
|||
295
kyvv
04.12.15
✎
15:37
|
Кстати, ЯR1C for developer.
|
|||
296
Serginio1
04.12.15
✎
15:37
|
(293) А чем твое то решение лучше. Твой COM сервер тоже чуждая среда и в ней кроме автора мало кто подправит.
|
|||
297
Serginio1
04.12.15
✎
15:41
|
(295) И, что это за зверь?
|
|||
298
oleg_km
04.12.15
✎
15:41
|
(293) В чем противоествественность? Поддержка КОМ пока заявлена в 1С, сама 1С даже в типовых не гнушается ее использовать. Вот при взаимодействии с .NET еще ни разу не сталкивался, что что-то не работает. А вот с "нативными" объектами регулярно: то ИнтернетПочта сломается, то HTTPСоединение не фурычит.
|
|||
299
kyvv
04.12.15
✎
15:45
|
Встроенный язык 1с с английским синтаксисом для индусов.
|
|||
300
MM
04.12.15
✎
16:10
|
(298) Значит с помощью НЕТа почту и инет проверяете?
Или ещё для чего на практике используете? |
|||
301
oleg_km
04.12.15
✎
16:30
|
(300) Сейчас попробую все перечислить:
1) Отправка эл почты - в свое время обожглись на встроенной, когда после смены релиза вся наша почта встала, а 1С подтвердило ошибку и предложила ждать след. релиза платформы. 2) Очень много используется TCP/UDP 3) Сворачивание 1С на трей 4) Работа с КОМ: 4.1) Работа с GSM-модемом, отправка и прием СМС 4.2) Работа со сканером ШК полностью переведена на .NET 5) Рисование графики, карты, маршруты, места доставки. Через GDI+ рисуется в десятки раз быстрее чем посредством HTML+JS Ну и так по мелочевке дофига всего |
|||
302
oleg_km
04.12.15
✎
16:31
|
А, забыл, вместо HTTPСоединение изначально используем WebRequest. Требовались возможности, которых нет в HTTPСоединение, а теперь и не хочу связываться с 1С'ным. Его как я читаю, тоже периодически ломают.
|
|||
303
oleg_km
04.12.15
✎
16:38
|
А, еще, в трех местах используется System.IO.FileSystemWatcher - оповещение об изменении каталога для запуска различных обработок: обработки эл. почты, данных из СКУД и технологического журнала 1С.
Видите, уже всего и не упомнить |
|||
304
Serginio1
04.12.15
✎
16:41
|
(300) У меня еще 7 ка, а там куча всего.
Для 8 5ки изначально писал для доступа к Вэб сервисам по ws- протоколам. WhatsApp, SignalR. Кстати скоро выложу. Ну и по мелочи куча всего, чего в 1С нет или работает криво. |
|||
305
Masquerade
04.12.15
✎
17:00
|
(301)
Какой кошмар. Модемы. Карты. GDI туда же. АРХИТЕКТОРЪ! |
|||
306
Masquerade
04.12.15
✎
17:02
|
Всё, кроме "4.2) Работа со сканером ШК полностью переведена на .NET" прекрасно реализуется отднльно стоящим web-сервисом, доступным через http. Со всеми плюшками и преимуществами.
|
|||
307
Masquerade
04.12.15
✎
17:04
|
Забегая вперед, не надо только напрягаться насчет фантастических историй про сканера ШК. У меня их 150 штук. И без .NET
|
|||
308
MM
04.12.15
✎
17:05
|
(306) Сворачивание в трей тоже веб-сервисом?
|
|||
309
Masquerade
04.12.15
✎
17:05
|
(301)
-- 4.1) Работа с GSM-модемом, отправка и прием СМС У вас одна база что-ли?? |
|||
310
Masquerade
04.12.15
✎
17:05
|
(308)
-- Сворачивание в трей тоже веб-сервисом? Когда коту делать нечего - он знаете что делает?? |
|||
311
Serginio1
04.12.15
✎
17:25
|
(306) И в чем премущества? Это как штаны через голову надевать. Единственно, что такой подход нужен для реализации событий на сервере.
(307) Но через COM или Native API которая тоже чужеродна. (310) Ну так можно обо всем говорить. |
|||
312
Serginio1
04.12.15
✎
17:51
|
(310) Начал я эту разработку с того, что мне нужно было прикрутить Вэб сервис на ws- протоколах. С кучей классов с обширной иерархией. Писать отдельно для каждого класса обертку муторно, поэтому и сделал обертку над нетовскими классами. Теперь использовать неподдерживаемые вэб сервисы (в том числе с передачей данных через soap:Header) стало легко при этом есть куча примеров использования на C#.
И легко использовать классы NetObjectToIDispatch45 также как и встроенные в 1С классы для работы с Вэб сервисами, HTTP итд. |
|||
313
oleg_km
04.12.15
✎
18:58
|
(307) Да если на то пошло и сканер ШК можно реализовать локальным http сервисом. Вон полно шлюзов RS232 - TCP. Ты что доказать хочешь? Что правильно не выходить за возможности платформы? Но твои сканеры ШК уже используют ВК. Или правильные ВК - это только ВК, сделанные 1С'ом? Тоже сомнительно. Или все что ты считаешь ненужным - не нужно никому? Ну да, такая активная жизненная позиция.
|
|||
314
Serginio1
05.12.15
✎
09:21
|
(306) Кстати реально была ситуация, когда на складе была плохая связь. А базу перенесли в ДатаЦентр и работали с ней через RDP. Порты прокинули, но все это дело ужасно тормозило.
Мало того, печть по понятным причинам тоже жутко тормозила. А надо было печатать этикетки на огромное количество товаров. Выход такой. Сделал пустую базу, которая соединялась с реальной по TCP/IP через VPN c реальным сеансом. То есть шк считывались с локальной базы и по TCP/IP передавалась в реальную базу. При печати с реалного сеанса передавались только данные, а печатная форма создавалась на локальной базе. И все залетало. |
|||
315
Garykom
гуру
05.12.15
✎
09:34
|
(308) а нафейхуа?
если нету $ на отдельный "типа сервер", зачем им трей? в смысле не вижу смысла держать 1С-ку свернутой в трей, ладно еще держать там свою программку/агента которая и будет что нужно делать в т.ч. запуская 1с когда нужно (com или ole это уже по вкусу) |
|||
316
Serginio1
05.12.15
✎
09:55
|
314 + кстати http://catalog.mista.ru/public/238584/ там есть пример обмена по TCP/IP со сжатием данных для уменьшения трафика
|
|||
317
Garykom
гуру
05.12.15
✎
10:37
|
(314) когда гланды не через рот удаляют это конечно интересно... познавательно... но нафига?
в данном случае чем стандартный РИБ плох? специально настроенный чтобы не было лишнего? |
|||
318
Serginio1
05.12.15
✎
10:43
|
(317) База данных огромная. 60 миллионов записей по прайсам постоянно обновляющееся итд.
РДП в данном случае это как раз удаление гланд через одно место. |
|||
319
Garykom
гуру
05.12.15
✎
10:55
|
(318) так может надо было сделать чтобы .net вообще без tcp/ip (связи) работал?
свой принцип гравитационной или нейтринной изобрести? :) почему просто канал не наладить то было? до этого "датацентра" а то получилось стандартно, сначала создаем себе трудности чтобы потом героически их преодолевать |
|||
320
Serginio1
05.12.15
✎
11:17
|
(319) Склад находился в неудачном месте. Потом переехали на другой склад. Но решение нужно было сейчас.
Да суть и не в этом. Решение через TCP/IP на самом деле ооочень простое решение. Ничем не отличается от Вэб сервисов, только с обменом в обе стороны. Ты же их не считаешь чем то героическим. Обычная рутина. Кстати и сейчас решение формирование печатной формы на сервере, и передача её на клиента для печати огромных данных тоже не является оптимальным решением при работе через HTTP. Скоро выложу обмен сообщений,любых файлов по HTTP используя SignalR (WebSocket,Long polling). Можно использовать в браузере, в 1С, а мобильных девайсах (пока для андроида). По сути это аналог обмена по Tcp/Ip Знаю, что многие используют WhatsAp. Как ты думаешь такое решение нужно? |
|||
321
Garykom
гуру
05.12.15
✎
12:29
|
(320) телеграм нужно, а не вацап
|
|||
322
Serginio1
05.12.15
✎
12:32
|
(321) Я предлагаю независимое решение использовании связки Asp.Net + Nancy c byntuhfwbtq клиента в 1С, Web и мобильные приложения для связи клиентов 1С. В том числе и для мобильных клиентов. И не зависеть не от кого.
|
|||
323
Garykom
гуру
05.12.15
✎
12:35
|
А SignalR это вообще нечто... аналог tcp/ip протокола реализованный поверх http...
|
|||
324
Serginio1
05.12.15
✎
12:46
|
(323) И значительно проще в использовании.
http://metanit.com/sharp/mvc5/16.1.php |
|||
325
2mugik
05.12.15
✎
15:45
|
(0)хотелось бы попробовать, где можно скачать первоначальные файлы с обертками?
|
|||
326
Serginio1
05.12.15
✎
16:11
|
http://catalog.mista.ru/public/238584/
или в понедельник вышлю на почту |
|||
327
Serginio1
07.12.15
✎
10:31
|
(325) Гугл не пропускает
|
|||
328
Serginio1
07.12.15
✎
10:32
|
||||
329
Пикчер
15.12.15
✎
10:29
|
(301) не встречалась компонента прослушивания порта и отправки пакетов по udp?
|
|||
330
oleg_km
15.12.15
✎
10:59
|
(329) Что значит встречалась? Я ее сам за час написал. Вернее, если допустим нужно просто в синхроне например в фоновом задании читать и отвечать, то там даже компонент не нужен, кроме (328), вот код объекта СокетДатаграммы:
Процедура Инициализировать(Порт = 0) Экспорт Плагин = БиблАП.ПолучитьNET(); Сокет = Плагин.NewObj(Плагин.GetType("System.Net.Sockets.UdpClient", "System"), Порт); Запрос = Неопределено; ТаймАут = 10000; Кодировка = "windows-1251"; КонецПроцедуры Процедура Закрыть() Экспорт Сокет.Close(); КонецПроцедуры Функция ПринятьДанные(Адрес = Неопределено) Экспорт Если Запрос = Неопределено Тогда Запрос = Сокет.BeginReceive(Неопределено, Неопределено); КонецЕсли; мсДанные = Неопределено; Если Запрос.AsyncWaitHandle.WaitOne(ТаймАут) Тогда текАдрес = Плагин.NewObj(Плагин.GetType("System.Net.IPEndPoint", "System"), 0, 0); мсДанные = Сокет.EndReceive(Запрос, текАдрес); Запрос = Неопределено; Если ТипЗнч(мсДанные) = Тип("Число") Тогда ВызватьИсключение "СокетДатаграммы. Чтение данных"; КонецЕсли; Адрес = Новый Структура("Хост, Порт", текАдрес.Address.ToString(), текАдрес.Port); КонецЕсли; Возврат мсДанные; КонецФункции Процедура ПередатьДанные(Хост, Порт, мсДанные) Экспорт Сокет.Send(мсДанные, мсДанные.Length, Хост, Порт); КонецПроцедуры |
|||
331
Пикчер
15.12.15
✎
11:06
|
(330) в том то и дело, что должно генериться внешнее событие для 1с, когда на прослушиваемый порт приходит пакет
|
|||
332
Пикчер
15.12.15
✎
11:30
|
(331) + нашел рабочий код с ExternalEvent
|
|||
333
Serginio1
15.12.15
✎
11:53
|
(332) Так Динамическая компиляция в том числе и генерирут обертку для внешних событий
ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C"); объект = СоздатьОбъект("AddIn.GlobalContext1C"); ГлобальныйКонтекст= объект.ГлобальныйКонтекст; ОберткаСобытий= врап.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст); |
|||
334
Serginio1
17.12.15
✎
10:05
|
(331) Посмотри 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
SignalR это аналог udp только по HTTP со всеми вытекающими. Плюс простота программирования. |
|||
335
Serginio1
18.12.15
✎
10:37
|
Можно повторно использовать скомпилированную сборку например
использовано здесь 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям Процедура ПолучитьОбертку(NetОбъект) // Использовал методы .Net классов для того, что бы показать технику использования обертки .Net классов Если не Объект.ИспользоватьСкомпилированнуюСборку Тогда ОберткаСобытий=врап.СоздатьОберткуДляСобытий(NetОбъект); возврат КонецЕсли; //Так как сборка компилируется в реальную DLL, то если сборка SignalRHelloClient.dll не менялась, то и обертку событий компилировать не нужно // Используем ТипКакОбъект для получения методов Type // По умолчанию для типа используются статические методы Тип=Врап.ТипКакОбъект(NetОбъект.GetType()); ИмяФайлаСборки = тип.Assembly.Location; Path=Врап.ПолучитьТип("System.IO.Path"); Каталог = Path.GetDirectoryName(ИмяФайлаСборки); ТипСтрРеальногоОбъекта = тип.FullName; // Применим метод ОбернутьЛюбойОбъект для получения методов String // Так как String возвращается без обертки ИмяКласса = "ВрапперДля" + Врап.ОбернутьЛюбойОбъект(Врап.ОбернутьЛюбойОбъект(ТипСтрРеальногоОбъекта).Replace(".", "_")).Replace("+", "_"); OutputAssembly = Path.Combine(Каталог, ИмяКласса) + ".dll"; Если Врап.ПолучитьТип("System.IO.File").Exists(OutputAssembly) Тогда ТипОбертки=Врап.ПолучитьТипИзСборки(ИмяКласса,OutputAssembly); // У типа ТипОбертки есть статический метод СоздатьОбъект который принимает обертываемый объект Попытка объектОбертка=ТипОбертки.СоздатьОбъект(Врап,NetОбъект); Исключение врап.ВывестиПоследнююОшибку() КонецПопытки; // Нужно получить COM объект из обертки ОберткаСобытий=Врап.ПолучитьРеальныйОбъект(объектОбертка); Иначе // Нет скомпилированной DLL ОберткаСобытий=врап.СоздатьОберткуДляСобытий(NetОбъект); КонецЕсли; КонецПроцедуры // ПолучитьОбертку() |
|||
336
Serginio1
30.12.15
✎
11:14
|
Кстати посмотрел многих заинтересовала Строка в дату
http://catalog.mista.ru/public/434345/ Может кто подскажет, что может заинтересовать людей, то что нет в 1С, но есть в .Net |
|||
337
Garykom
гуру
30.12.15
✎
11:31
|
(336) заинтересовало потому что тема нужная, но вот реализация все равно сложновата (хотя надо признать уже намного понятнее статья вышла)
для 1С-ников нужно нечто ТекДата = Строка2Дата(ТекСтрока, ТекФормат); где ТекФормат = "ДД-ММ-ГГГГ" или ТекФормат="ДД.ММ.ГГ" |
|||
338
Garykom
гуру
30.12.15
✎
11:34
|
(337)+ т.е. скрывать всё длинное и непонятное под спойлеры и(или) упрощать по максимуму вызовы из 1С
т.е. подключил ВК 1-2 строками, и просто вызвал метод и все ЗЫ по поводу что нужно, недавно куча запросов была на сохранение табличных документов в картинку |
|||
339
Serginio1
30.12.15
✎
11:39
|
(338) Ну сделать, то функцию не проблема. Кстати ничем не сложнее ComОбъект
|
|||
340
Garykom
гуру
30.12.15
✎
11:42
|
(339) это смотря кому "не проблема"
|
|||
341
Serginio1
30.12.15
✎
11:51
|
(340) Причесать не проблема. Проблема понять, что причесывать. Например
БиблиотекаNET = новый COMОбъект("NetObjectToIDispatch45"); DateTime = БиблиотекаNET.ПолучитьТип("System.DateTime"); КлассCultureInfo = БиблиотекаNET.ПолучитьТип("System.Globalization.CultureInfo"); ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект(КлассCultureInfo, "ru-Ru"); DataTimeStyles = БиблиотекаNET.ПолучитьТип("System.Globalization.DateTimeStyles"); Дата = DateTime.ParseExact ( "10 февраля 1978", "dd MMMM yyyy", ОбъектCultureInfo, DataTimeStyles.None ); Не проблема завернуть в функцию. С этим справится не только взрослый, но даже |
|||
342
Garykom
гуру
30.12.15
✎
11:54
|
(341) так это нужно знать c# чтобы "правильно завернуть"
иначе при заворачивания ничего не будет работать |
|||
343
Serginio1
30.12.15
✎
12:00
|
(342) Знать надо .Net. Есть документация например https://msdn.microsoft.com/ru-ru/library/system.datetime.parseexact(v=vs.110).aspx
Есть Google, форумы где можно найти решение проблемы. Главное задать вопрос и многие помогут. Проблема в том, что никто и задавать то вопросы не хочет, а если даешь готовое решение, то не берут, но кактус то едят |
|||
344
Garykom
гуру
30.12.15
✎
18:06
|
(343) кактус невкусный можно не жуя проглотить быстро, а на изучение .net сколько времени уйдет?
|
|||
345
Garykom
гуру
30.12.15
✎
18:07
|
(344)+ а кто .net уже изучил тому (0) нафиг не сдалось, так как легко в шаблон ВК что нужно вставит
или другим способом извратится при желании |
|||
346
Serginio1
30.12.15
✎
19:16
|
(345) Я делал эту разработку, для того что бы использовать вэб сервисы неподдерживаемые 1С, где была куча классов и оборачивать их в COM было муторно. Кроме того динамическая компиляция свойств просто экономит кучу времени, где это надо делать вручную.
Еще раз. Многие пользуются COM объектами просто копируя примеры. Использование .Net будет больше, когда этих примеров будет тоже куча. Но к сожалению пока очень мало, кто использует эту разработку. Поэтому я и прилагаю силы для её рекламы. Кстати 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям тоже многих заинтересовал http://catalog.mista.ru/public/434771/ |
|||
347
Serginio1
30.12.15
✎
19:17
|
Кроме того динамическая компиляция событий
|
|||
348
Serginio1
30.12.15
✎
19:22
|
346 +
Добавил в 1C Messenger рабочий вариант для Android на Xamarin. Проверял на эмуляторе. На IOS не проверял. Из пакетов убрал Xamarin.Forms.2.0.0.6490 он 20 мб |
|||
349
Serginio1
21.01.16
✎
13:58
|
Поигрался со Scripting-APIhttps://github.com/dotnet/roslyn/wiki/Scripting-API-Samples#exprstrong
Создал сборку. Проинсталировал Install-Package Microsoft.CodeAnalysis.Scripting Создал класс namespace ScriptApiDlls { public class КлассДляВычесленияВыражений { public static Microsoft.CodeAnalysis.Scripting.ScriptOptions Опции { get { return Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default; } } public static object Вычислить(string Код, Microsoft.CodeAnalysis.Scripting.ScriptOptions опции ) { return Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(Код, опции).Result; } } } |
|||
350
Serginio1
21.01.16
✎
14:01
|
Теперь можно на примере регулярных выражений создать делегат и использовать его в Replace? например для того, что бы все слова начинались с заглавной буквы
врап=новый COMОбъект("NetObjectToIDispatch45"); Match=Врап.ПолучитьТипИзСборки("System.Text.RegularExpressions.Match","System.dll"); Regex=Врап.ПолучитьТип("System.Text.RegularExpressions.Regex"); КлассДляВычесленияВыражений=Врап.ПолучитьТипИзСборки("ScriptApiDlls.КлассДляВычесленияВыражений",ПутьКДлл+"ScriptApiDlls.dll"); ScriptOptions=КлассДляВычесленияВыражений.Опции; Слова = "надо заменить все первые буквы в словах на заглавные"; pattern = "\w+"; // MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегат(); scr = ScriptOptions.Default.WithReferences(Врап.ТипКакОбъект(Match).Assembly) .WithImports("System", "System.Text.RegularExpressions"); ТекстДелегата = "return (MatchEvaluator)((match) => |{ | string x = match.Value; |// Если первая буква в нижнем регистре то заменяем на заглавную |if (char.IsLower(x[0])) |{ | // Capitalize it. | return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1); |} |return x; | | });"; evaluator = КлассДляВычесленияВыражений.Вычислить(ТекстДелегата,scr); Сообщить(Regex.Replace(Слова, pattern, evaluator)); |
|||
351
Serginio1
21.01.16
✎
14:02
|
В итоге получаем
Надо Заменить Все Первые Буквы В Словах На Заглавные |
|||
352
Serginio1
21.01.16
✎
14:03
|
Может кто то придумает более интересные примеры и применение делегатов для часто используемых вычислений
|
|||
353
Serginio1
21.01.16
✎
15:04
|
Кстати практический пример. На инфостарте редактор схлопывает span с пробелами. Я не большой знаток регкспов по этому у меня вопрос.
Вот делегат который заменяет <span> </span на nbsp; по количеству пробелов MatchEvaluator ПолучитьДелегатДляЗкменыПробела() { return (MatchEvaluator)((match) => { var группа = match.Groups[1]; int размерГруппы = группа.Value.Length; if (размерГруппы == 0) return ""; return string.Concat(Enumerable.Repeat(@" ", размерГруппы)); }); } |
|||
354
Serginio1
21.01.16
✎
15:07
|
Сам регекс такой
string words =textBoxOrig.Text; string pattern = @"<span>( +)</span>"; MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегатДляЗкменыПробела(); textBoxEval.AppendText(Regex.Replace(words, pattern, evaluator)); |
|||
355
Serginio1
22.01.16
✎
11:34
|
Поизвращался еще с делегатами объекта
string ПолучитьСтрокуКласса() { var res = @" class ClassTest { string строка; public Func<string> ЗаданнаяСтрока; public ClassTest(string Строка) { строка = Строка; ЗаданнаяСтрока = () => строка; } public static Func<string> ПолучитьДелегатОбъекта(string Строка) { var obj = new ClassTest(Строка); return obj.ЗаданнаяСтрока; } } return new Func<string, Func<string>>(ClassTest.ПолучитьДелегатОбъекта); "; return res; } private void button2_Click(object sender, RoutedEventArgs e) { var делегат = (Func < string, Func< string >> )ClassTest.testReturnDelegate(); textBoxEval.AppendText(делегат("Тестовая строка")()+Environment.NewLine); var scr = Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default .WithImports("System"); var Скрипт = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.Create(ПолучитьСтрокуКласса(), scr); // Скрипт.ContinueWith("return new Func<string, Func<string>>(ClassTest.ПолучитьДелегатОбъекта);"); var obj = делегат = (Func<string, Func<string>>)(Скрипт.CreateDelegate()().Result); textBoxEval.AppendText(делегат("Тестовая строка 2")() + Environment.NewLine); } } |
|||
356
Serginio1
22.01.16
✎
17:23
|
Хотя можно вызвать и
var result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(ПолучитьСтрокуКласса(), scr).Result; делегат = (Func<string, Func<string>>)result; textBoxEval.AppendText(делегат("Тестовая строка 2")() + Environment.NewLine); |
|||
357
Garykom
гуру
22.01.16
✎
18:15
|
(356) Не подскажешь как на .net с чужими окнами работать?
К примеру отслеживать текст в них? Хочу мини расширение для конфигуратора штатного, по шорткату чтобы интеллсенсе свой открывался |
|||
358
Garykom
гуру
22.01.16
✎
18:28
|
(357)+
А еще можно ли в 1С 8 сделать динамическую компиляцию "кода 1С"? Смысл сделать свою веб БСП. Нечто вроде вызова в коде "ПодключитьМодуль("МойМодуль");" И после этого можно вызывать процедуры и функции из "МойМодуль" На языке 1С понятно тело модуля и процедур/функций. Просто можно удобно сделать тогда и универсально для разных платформ и даже разных конф типовых готовые процедуры/функции сгруппированные по модулям. |
|||
359
Карупян
22.01.16
✎
18:33
|
(357) хочешь свой опенконф написать?
|
|||
360
Garykom
гуру
22.01.16
✎
18:41
|
(359) нафуя? мне просто анализа кода и подстановки нужного хватит
или банальной вставки шаблонов тех же типовых циклов или прочих типа получение данных запросом и т.д. |
|||
361
Garykom
гуру
22.01.16
✎
18:43
|
(360)+ логично к примеру что если пишу
"Для Каждого ТекСтр Из ТЗ Цикл" то после ентер оно "КонецЦикла;" само вставило ниже и пустую строку еще оставило куда курсор встал автоматом )) |
|||
362
Garykom
гуру
22.01.16
✎
18:45
|
(361)+ хотя да это одна из возможностей опенконфа для 1С 7.7
кроме прочей кучи плагинов |
|||
363
oleg_km
22.01.16
✎
19:47
|
(357) Это вроде как hook
Вот мой класс, который отслеживает активизацию всех окон в 1С, может на основе свое создашь: using System; using System.Collections; using System.Runtime.InteropServices; using System.Diagnostics; namespace _1CAddInNET { [ComVisible(true)] [ProgId("1CAddInNET.HookWnd")] [ClassInterface(ClassInterfaceType.AutoDispatch)] [Guid("193E58D3-E598-4AA5-B624-0770A90AEBBD")] public class HookWnd { private const int HCBT_ACTIVATE = 5; private const int SW_HIDE = 0; private const int WH_CBT = 5; private ArrayList hookID; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, WinCallbackProc lpfn, IntPtr hMod, int dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool IsWindowVisible(IntPtr wParam); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool ShowWindow(IntPtr wParam, int nMode); private delegate IntPtr WinCallbackProc(int nCode, IntPtr wParam, IntPtr lParam); private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode == HCBT_ACTIVATE) if (IsWindowVisible(wParam)) ShowWindow(wParam, SW_HIDE); return IntPtr.Zero; } public HookWnd() { hookID = new ArrayList(); } public void SetHook() { foreach (ProcessThread curThread in Process.GetCurrentProcess().Threads) hookID.Add(SetWindowsHookEx(WH_CBT, HookCallback, IntPtr.Zero, curThread.Id)); } public void DoneHook() { foreach (IntPtr curHook in hookID) UnhookWindowsHookEx(curHook); } } } |
|||
364
Garykom
гуру
22.01.16
✎
19:56
|
(363) думал проще только через
[DllImport("user32")] public static extern int FindWindow(string ClassName,string lpWindowName ); и даже без хуков на клаву, хотя с ними лучше будет |
|||
365
Serginio1
22.01.16
✎
20:15
|
(364) Можно пройтись по элементам
http://rsdn.ru/forum/pda/2953653.1 |
|||
366
Serginio1
22.01.16
✎
20:16
|
Кроме того в ТестВК есть поиск окна 1С 7.7 и установки видимости
|
|||
367
Garykom
гуру
22.01.16
✎
20:18
|
(365) угу только вроде 1с 8 на вин мобайл не того ;)
|
|||
368
Serginio1
22.01.16
✎
20:22
|
(367) Win.Api то одинаковый. Посмотри как и ищется нужный элемент
public static bool isChecked(IntPtr hwndCheck) { int BM_GETCHECK = 240; int BST_CHECKED = 1; int BST_UNCHECKED = 0; IntPtr res = Win32Window.SendMessage(hwndCheck, BM_GETCHECK, 0, 0); // Если галочка стоит. if ((int)res == BST_CHECKED) { return true; } // Если галочка не стоит. if ((int)res == BST_UNCHECKED) { return false; } return false; } public static void SetWLANState(bool state) { //SetWifi(true); // WiFiAdapter(). String ExeName = "ctlpnl.exe"; String CmdLine = "\\Windows\\WLanPower.cpl,0"; ProcessInfo pi = new ProcessInfo(); // CreateProcess(ExeName,CmdLine , pi); Int32 INFINITE; unchecked { INFINITE = (int)0xFFFFFFFF; } if (pi == null) pi = new ProcessInfo(); byte[] si = new byte[128]; CreateProcess(ExeName, CmdLine, IntPtr.Zero, IntPtr.Zero, 0, 0, IntPtr.Zero, IntPtr.Zero, si, pi); // Thread.Sleep(1000); IntPtr hWnd = Win32Window.FindWindow(null, "Set WLAN Power"); while (hWnd == IntPtr.Zero) { Thread.Sleep(100); hWnd = Win32Window.FindWindow(null, "Set WLAN Power"); } IntPtr gg; IntPtr OKHandle = IntPtr.Zero; IntPtr WLHandle = IntPtr.Zero; IntPtr CancelHandle = IntPtr.Zero; // MessageBox.Show(Win32Window.GetWindowText(hEdit)); gg = Win32Window.GetWindow(hWnd, GW.CHILD).Handle; while (gg != IntPtr.Zero) { if (Win32Window.GetWindowText(gg) == "OK") OKHandle = gg; if (Win32Window.GetWindowText(gg) == "WirelessLAN ON") WLHandle = gg; if (Win32Window.GetWindowText(gg) == "Cancel") CancelHandle = gg; // MessageBox.Show(Win32Window.GetWindowText(gg)); // MessageBox.Show(gg.Text); gg = Win32Window.GetWindow(gg, GW.HWNDNEXT).Handle; // gg = Win32Window.GetWindow(gg, GW.CHILD).Handle; } // MessageBox.Show(isChecked(WLHandle).ToString()); if (isChecked(WLHandle)!=state) { emulPress(WLHandle); emulPress(OKHandle); } else emulPress(CancelHandle); WaitForSingleObject(pi.hProcess, INFINITE); } |
|||
369
Serginio1
22.01.16
✎
20:55
|
А вообще тебе проще обратиться к orefkov
а вин апи перевести на C# не проблема |
|||
370
Garykom
гуру
22.01.16
✎
20:57
|
(368) да как бы в курсе как через вин апи, делал на лазарусе прогу по управлению другой прогой
вдруг думал на нет фреймворке что то уже изобрели |
|||
371
Garykom
гуру
22.01.16
✎
20:57
|
(369) не будем отвлекать товарища, а то никогда снегопата не дождемся
|
|||
372
Serginio1
22.01.16
✎
21:04
|
(370) Ну интероп функций можно посмотреть здесь
http://www.pinvoke.net/default.aspx/user32.getwindow |
|||
373
Garykom
гуру
23.01.16
✎
14:23
|
(372) бесполезно (почти) смотреть
похоже 1С очень не понравился openconf и в 8-ке сделано многое чтобы низзя было так просто наваять нечто подобное поэтому и снегопату плохо )) и если в 1С захотят оно никогда не взлетит |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |