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