|   |   | 
| 
 | Собираюсь писать ВК для 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) завидую людям, которые ощущают себя во всем компетентными. ггг     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |