![]() |
|
Собираюсь писать ВК для 1С на C# Ø (длинная ветка 21.12.2020 20:41) |
☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
11.12.20
✎
19:44
|
Пример буду брать из "Технологии внешних ВК" на ИТС.
Вопрос такой - где брать платформу C# (IDE)? По сути, мне надо обертку над DLL писать. Раньше ее писал на VB6, но пора переходить на C#, у производителя оборудования пример на C#, кроме того нужна версия компоненты на 32 и 64 разряда. |
|||
903
Кирпич
21.12.20
✎
15:52
|
(902)А чо такого?. Ну сократили малость писанины
|
|||
904
Гений 1С
гуру
21.12.20
✎
15:57
|
Гм, столкнулся с тем, что не создается COM, если в конструктор добавляю обращение к DLL.
Если убираю, работает. Может убрать из конструктора и перенести в какой-нибудь специфичный класс Init, попробую. И еще, как убрать "AddIn.AnvizCCH" из памяти, а то приходится перезаходить из 1С, она блокирует этот DLL и не дает ее перекомпилить. namespace AnvizCCH { // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [ComVisible(true), ProgId("AddIn.AnvizCCH")] //public class AnvizCCH : AddInLib.ILanguageExtender public class AnvizCCH { //const string c_AddinName = "AnvizCCH"; public IntPtr anviz_handle; public string last_error; public string Test() { //Здесь внешняя компонента выполняет код функций. return "Test, now time: " + DateTime.Now; } public string Error() { //Здесь внешняя компонента выполняет код функций. return last_error; } public int Connect(string IP, int port) { //Здесь внешняя компонента выполняет код функций. int ret = AnvizNew.CCHex_ClientConnect(anviz_handle, Encoding.UTF8.GetBytes(IP), port); return ret; } public AnvizCCH() { try { //anviz_handle = AnvizNew.CChex_Start(); } catch(IndexOutOfRangeException ex) { last_error = ex.Message; } } } } |
|||
905
Гений 1С
гуру
21.12.20
✎
15:58
|
(890) прописал, использовал онлайн-конструктор ГУИД
|
|||
906
Кирпич
21.12.20
✎
16:00
|
(904) //как убрать "AddIn.AnvizCCH" из памяти
Сирожка, это .NET. Он нихера не выгружает без бубна. Пиши на С++ Serginio1 может знает. |
|||
907
Кирпич
21.12.20
✎
16:02
|
Хотя может просто Неопределено присвоить объекту в 1с
|
|||
908
Garykom
гуру
21.12.20
✎
16:02
|
||||
909
acht
21.12.20
✎
16:03
|
Скажите, а "Собираюсь писать ВК для 1С на C#. Часть 2" будет?
Ну как с проепаным ноутбуком? |
|||
910
Кирпич
21.12.20
✎
16:04
|
(909) Будет. Можешь смело продавать билеты. Вы там всем колхозом в кинотеатре смотрите?
|
|||
911
Кирпич
21.12.20
✎
16:06
|
catch(IndexOutOfRangeException ex) - это от китайцев скопипастил или сам придумал?
|
|||
912
H A D G E H O G s
21.12.20
✎
16:07
|
Сергей собирает ВК
https://youtu.be/8HZ4DnVfWYQ |
|||
913
Кирпич
21.12.20
✎
16:08
|
ту хелп ёр бизнес
|
|||
914
Гений 1С
гуру
21.12.20
✎
16:11
|
(911) это отседова: https://www.youtube.com/watch?v=A0lccpS6P8s&feature=youtu.be
|
|||
915
Гений 1С
гуру
21.12.20
✎
16:11
|
(909) будет, будет. ;-) я ж работаю
|
|||
916
Serginio1
21.12.20
✎
16:12
|
(904) Никак. Но зачем ты тестишь через 1С? Создай какой нибудь WinForms и отлаживайся напрямую
|
|||
917
Serginio1
21.12.20
✎
16:12
|
||||
918
Гений 1С
гуру
21.12.20
✎
16:13
|
(916) я так VB тестил. А как через WinForms?
|
|||
919
Ненавижу 1С
гуру
21.12.20
✎
16:13
|
так, конструкторы уже появились... это уже немножко ООП начинается, а говорили не будет порнографии
|
|||
920
H A D G E H O G s
21.12.20
✎
16:13
|
(918) Да ладно.
|
|||
921
H A D G E H O G s
21.12.20
✎
16:14
|
Я так понимаю, G1C открывает мыльную оперу, судя по (918)
|
|||
922
Кирпич
21.12.20
✎
16:14
|
(914) Я так понял, ты там ничо не смотрел.
|
|||
923
Кирпич
21.12.20
✎
16:15
|
или не понял
|
|||
924
Serginio1
21.12.20
✎
16:15
|
(918) В этом же проекте добавь еще один проект WiForms. Добавь в ссылки отлаживаемый проект . Кинь на форму кнопку, двойной щелчок и напиши вызов
|
|||
925
Кирпич
21.12.20
✎
16:16
|
(924) А в консольке нельзя чтоли?
|
|||
926
Serginio1
21.12.20
✎
16:17
|
||||
927
Serginio1
21.12.20
✎
16:18
|
(925) Фи консолька, это не путь визуальщика. Это любители С++ любят консольки.
Можно конечно |
|||
928
Гений 1С
гуру
21.12.20
✎
16:19
|
(924) Вызов типа создать COM-объект?
|
|||
929
Гений 1С
гуру
21.12.20
✎
16:19
|
О, вынес из конструктора обращение к Start, начало ругаться на DLL, хорошо.
А есть какой-нибудь метод, который вызывается после создания COM-объекта? Произошла исключительная ситуация (AnvizCCH): Не удается загрузить DLL "tc-b_new_sdk.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E) {МодульУправляемогоПриложения(9)}: Сообщить("Connect:" + Компонента.Connect("10.10.42.60", 5010)); по причине: Произошла исключительная ситуация (AnvizCCH): Не удается загрузить DLL "tc-b_new_sdk.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E) |
|||
930
Кирпич
21.12.20
✎
16:20
|
(929) Прочитай сообщение об ошибке еще раз
|
|||
931
Serginio1
21.12.20
✎
16:21
|
(928) Ты до вызова создать COM-объект отладь то, что хочешь сделать. А потом уже переноси на 1С.
Dll должна быть вместе с проектом. Добавь её в проект и проставь копировать в каталог |
|||
932
Гений 1С
гуру
21.12.20
✎
16:21
|
(930) кстати, в NET можно положить tc-b_new_sdk.dll рядом с AnvzCCH.dll, а не кидать ее в каталог винды, мило.
|
|||
933
Гений 1С
гуру
21.12.20
✎
16:22
|
(931) что значит "копировать в каталог"?
|
|||
934
Кирпич
21.12.20
✎
16:22
|
(933) мышкой перетащить
|
|||
935
Serginio1
21.12.20
✎
16:23
|
Или ручками в нужный каталог
(933) Ну в каталог где запускается приложение в зависимости Release Debug |
|||
936
Serginio1
21.12.20
✎
16:24
|
||||
937
Кирпич
21.12.20
✎
16:24
|
(932) "кстати, в NET можно положить tc-b_new_sdk.dll рядом с AnvzCCH.dll, а не кидать ее в каталог винды, мило."
Ахиреть просто. :) |
|||
938
Garykom
гуру
21.12.20
✎
16:28
|
(932) >кстати, в NET можно положить tc-b_new_sdk.dll рядом с AnvzCCH.dll, а не кидать ее в каталог винды, мило.
так то можно полный путь указать и положить куда угодно |
|||
939
Кирпич
21.12.20
✎
16:28
|
(932) После 20 лет в IT Гений обнаружил, что любая программа ищет dll сначала рядом с собой. Редкостный специалист.
|
|||
940
Кирпич
21.12.20
✎
16:35
|
+(939) вернее не программа ищет, а Windows
|
|||
941
H A D G E H O G s
21.12.20
✎
16:36
|
(939) Она ищет почти везде, не давая права на ошибку, но у нас Сергей.
https://www.gunsmoker.ru/2015/11/do-not-use-LoadLibrary.html |
|||
942
Гений 1С
гуру
21.12.20
✎
16:38
|
var ObjRef = Activator.CreateInstance("Addin.Anviz");
MessageBox.Show (ObjRef.Test, "Запуск ВК"); гм, а как создать COM-Объект в C#? Ошибка CS1503 Аргумент 1: не удается преобразовать из "string" в "System.Type". |
|||
943
Кирпич
21.12.20
✎
16:38
|
(941) Ждем новую статью от гения "Почему DLL не загружается"
|
|||
944
Кирпич
21.12.20
✎
16:42
|
(942) Посмотри в гугле
|
|||
945
Serginio1
21.12.20
✎
16:44
|
наверное new AnvizCCH.AnvizCCH(); если ты его к проекту подключил. Ты опять не читаешь, что я тебе пишу, а поступаешь так как сам понимаешь.
|
|||
946
Serginio1
21.12.20
✎
16:45
|
(942 ты хоть GUID то прописал?
|
|||
947
Serginio1
21.12.20
✎
16:49
|
(942) Мыши кололись
Type t = Type.GetTypeFromProgID(progID); object obj = Activator.CreateInstance(t); Но зачем тебе СО если ты можешь работать с типом напрямую? Все ухожу! |
|||
948
Гений 1С
гуру
21.12.20
✎
16:50
|
(945) в сборке сделал два проекта, один с формами, другой с COM
using AnvizCCH; - пишет, что не найдено пространство имен или сборка |
|||
949
Гений 1С
гуру
21.12.20
✎
16:51
|
Спасибо, получилось, просто добавил ссылку на проект COM в проект Форм.
|
|||
950
Гений 1С
гуру
21.12.20
✎
16:52
|
О, даже отладка работает, как мило. ;-)
|
|||
951
Кирпич
21.12.20
✎
16:53
|
(949) Слава богу. А то Serginio1 уже за сердце схватился
|
|||
952
Гений 1С
гуру
21.12.20
✎
17:00
|
Странно, включил dll в проект, но при обращении к функции DLL не находит VS эту DLL, а вот 1С находит. ЧЯДНТ?
|
|||
953
Кирпич
21.12.20
✎
17:01
|
linq
|
|||
954
Гений 1С
гуру
21.12.20
✎
17:03
|
(953) что linq?
|
|||
955
Кирпич
21.12.20
✎
17:04
|
(954) Это я Serginio вызываю
|
|||
956
Кирпич
21.12.20
✎
17:05
|
положи уже dll куда надо и не парься. В каталог, который есть в path, например
|
|||
957
H A D G E H O G s
21.12.20
✎
17:07
|
(956) "Что такое path" © Г1С
|
|||
958
Serginio1
21.12.20
✎
17:16
|
(952) Положи нативную Dll в исполняемый проект, что бы она копировалась в нужный катало
Добавь ссылку на проект твоей C# библиотеки в исполняемый проект https://docs.microsoft.com/ru-ru/visualstudio/ide/managing-references-in-a-project?view=vs-2019 |
|||
959
Serginio1
21.12.20
✎
17:17
|
||||
960
Garykom
гуру
21.12.20
✎
17:24
|
(952) бывает
|
|||
961
Garykom
гуру
21.12.20
✎
17:24
|
(957) ыыыыы
|
|||
962
Serginio1
21.12.20
✎
17:29
|
(962) Смотри каталог Bin исполняемого проекта, твоя dll должна быть там. По 32 и 64 dll я уже тебе ссылки давал
|
|||
963
Serginio1
21.12.20
✎
17:30
|
||||
964
Serginio1
21.12.20
✎
18:15
|
Почитай про статические конструкторы
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/static-constructors |
|||
965
Ненавижу 1С
гуру
21.12.20
✎
18:34
|
(964) ты ему ещё про финализаторы расскажи
|
|||
966
Гений 1С
гуру
21.12.20
✎
18:44
|
(962) Положил в каталог, так она ругается: {"Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)"}
|
|||
967
H A D G E H O G s
21.12.20
✎
18:50
|
(966) Кхаб должен страдать
|
|||
968
Serginio1
21.12.20
✎
18:51
|
(966) У тебя наверняка с SDK есть демо на C#. Посмотри, что там и как.
Опять же читаем https://geekhow.ru/os/windows/0x8007000b/ Смотри какой у тебя процесс. Какой разрядности dll. |
|||
969
Гений 1С
гуру
21.12.20
✎
18:52
|
(968) я туда и 32 и 64 кидал DLL, Не алле. При этом в 1С все норм работает, только отлаживать сложно
|
|||
970
Гений 1С
гуру
21.12.20
✎
18:56
|
сукко, новый SDK асинхронный, а поставлена задача совместимости, значит, будем таймауты вешать.
|
|||
971
Ненавижу 1С
гуру
21.12.20
✎
18:59
|
(970) ты вот к чему этот набор слов сейчас произнёс?
|
|||
972
Кирпич
21.12.20
✎
18:59
|
Кинозал охнул
|
|||
973
Serginio1
21.12.20
✎
19:07
|
(969) У тебя наверняка 1С 32 разрядная и у тебя dll импорт к ней и прописан. У тебя отладчик в руках. Можешь поменять Any CPU на x86ю
Проблема в разрядности. Нужно всетаки читать, то что тебе дают. У Task есть свойство Result и метод Wait/ https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task-1.result?view=net-5.0 |
|||
974
H A D G E H O G s
21.12.20
✎
19:08
|
(970) Там же есть callback-и, ведь да, да?
|
|||
975
Serginio1
21.12.20
✎
19:11
|
https://docs.microsoft.com/ru-ru/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming
(974) Калбеки будут в другом потоке. |
|||
976
Serginio1
21.12.20
✎
19:13
|
||||
977
H A D G E H O G s
21.12.20
✎
19:20
|
// Из интервью Сергея, окрестности 2022 года.
https://youtu.be/aHLfyWfeATk |
|||
978
Кирпич
21.12.20
✎
19:24
|
(975) Не запутывайте пациента
|
|||
979
Кирпич
21.12.20
✎
19:29
|
(970) Ты где там увидел асинхронное, балда?
|
|||
980
Serginio1
21.12.20
✎
19:37
|
(979) Наверное async await если смотреть https://github.com/MxLabs/Anviz/blob/0a1750ef616b27d8f819eb5cd0c081d7db9f1827/Sample/Program.cs
То там есть и подписка на события и async await |
|||
981
Кирпич
21.12.20
✎
19:46
|
(980) Да нет. То не то.
|
|||
982
Гений 1С
гуру
21.12.20
✎
19:48
|
Коллеги, я написал необходимый минимум - подключился к устройству, получил с него время.
Как понимаете, это определенный этап оплаты, так что скоро пойду дальше. Но считаю, что все самое сложное позади. Большое спасибо всем, кто помогал, вольно или невольно. Спасибо Сергиньо, что все же убедил в C#, хороший язык, почти как Бейсик (или 1С). ;-) Удивило, что новое SDK асинхронное. Это, конечно, капец, ради совместимости с прошлыми версиями придется вводить тайм-ауты. Вот лог, да-да, та самая старая добрая трассировка: Time:2020.12.21.19:38:44 Windows x86 Test, now time: 21.12.2020 19:38:38 Start:Да Connect:1 Log:Enter wait event: 2 Wait UPD Event: 21.12.2020 19:38:38 Wait UPD Event: 21.12.2020 19:38:38 UPD Event: 2 wait for: 2 Enter wait event: 19 Wait UPD Event: 21.12.2020 19:38:39 Wait UPD Event: 21.12.2020 19:38:39 UPD Event: 19 wait for: 19 Get time Ret: 1 Enter wait event: 39 Wait UPD Event: 21.12.2020 19:38:40 Wait UPD Event: 21.12.2020 19:38:40 UPD Event: 39 wait for: 39 OK Time Event: Get time: 2020.12.21.19:38:44 Кто знает, как в Шарпе поставить паузу, я ставлю в секунду, но, судя по логу не работает: System.Threading.Thread.Sleep(1000); И еще: как бы в классе разместить постоянный буфер динамический, чтобы постоянно его не таскать по методам: IntPtr pBuff; int len = 32000; pBuff = Marshal.AllocHGlobal(len); Просто IntPtr pBuff сделать приватным членом класса и инициализировать в конструкторе? |
|||
983
Гений 1С
гуру
21.12.20
✎
19:50
|
(979) да, там асинхронка, кури метод CChex_Update. Он возвращает событие из очереди.
После успешного вызова метода событие может еще туда быть не помещено, нужно ждать. Поэтому и тайм-аут. я ж тебе лог в (978) выслал |
|||
984
Гений 1С
гуру
21.12.20
✎
19:52
|
(973) ну я еще побьюсь, все же удобно в VS отладчике отлаживать. Но если не победю, то будет старая-добрая трассировка, я ею и в VB6 спокойно пользовался.
|
|||
985
Garykom
гуру
21.12.20
✎
19:54
|
(983) асинхронка это не таймаут, это когда передаешь адрес свой функции и ее дернут когда будет готово
Callback короче |
|||
986
Serginio1
21.12.20
✎
19:57
|
(985) async await и event, ContinueWith это немного большее чем примитивный Callback.
|
|||
987
Гений 1С
гуру
21.12.20
✎
20:01
|
(985) ну все может быть. Но в общем, разрыв контекста выполнения происходит, да.
|
|||
988
Serginio1
21.12.20
✎
20:04
|
Во почитай https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
https://docs.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#interleaved-operations Ты можешь использую TaskCompletionSource вернуть задачу и поставить её на Result, а когда событие прийдет вызвать TrySetResult нечто подобное я делал для Cef CEF, Angular 2 использование событий классов .Net Core https://habr.com/ru/post/321452/ |
|||
989
Garykom
гуру
21.12.20
✎
20:06
|
(986) в конечном итоге все сводится к коллбэкам
просто синтаксический сахар наворочен |
|||
990
Serginio1
21.12.20
✎
20:06
|
Ну или проще использовать waithandle эвенты
https://metanit.com/sharp/tutorial/11.6.php |
|||
991
Serginio1
21.12.20
✎
20:09
|
(989) Этот синтаксический сахар такой огромный, что в 1С только сейчас до async await доросли. Там и ConfigureAwait и много чего.
В итоге все сводится не к одному вызову а огромной куче вызовов, создания замыкания и автомата |
|||
992
Гений 1С
гуру
21.12.20
✎
20:13
|
(990) у меня этого слава богу нет.
|
|||
993
Кирпич
21.12.20
✎
20:18
|
(983) Ну да. Получается асинхронно. В примере по таймеру выгребаются все сообщения и обрабатываются. Все кишки в одном методе. Китайцы.
|
|||
994
Гений 1С
гуру
21.12.20
✎
20:20
|
(993) хоть указатель на функцию юзай. ;-)
|
|||
995
Кирпич
21.12.20
✎
20:23
|
Мож оно там где нибудь переключается на синхрон
|
|||
996
Serginio1
21.12.20
✎
20:27
|
(994) AutoResetEvent waitHandler.WaitOne(); ContinueWith waitHandler.Set();
|
|||
997
Гений 1С
гуру
21.12.20
✎
20:27
|
Учитывая, что ветка становится длинной и подходит к "логическому концу", резюмирую: вот благодаря таким задачам я понимаю, что я - "победитель по жизни". Взять абсолютно чуждую мне задачу, найти ресурсы и помощь, разобраться, решить и в конечном итоге прийти к результату, попутно написав пару статей, чтобы другим проще было топать по проторенному пути.
Мой фирменный "Гений-Стайл". |
|||
998
H A D G E H O G s
21.12.20
✎
20:33
|
||||
999
Кирпич
21.12.20
✎
20:37
|
(997) Лучше бы ты разобрался молча, написал бы свои статьи (не знаю кто эту пургу читает), а не вываливал на весь свет своё колхозное величие и некомпетентность.
|
|||
1000
Кирпич
21.12.20
✎
20:38
|
the end
|
|||
1001
H A D G E H O G s
21.12.20
✎
20:38
|
Он еще вернется.
|
|||
1002
Гений 1С
гуру
21.12.20
✎
20:41
|
(999) завидую людям, которые ощущают себя во всем компетентными. ггг
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |