Вход | Регистрация
    1  2  3  4  5  6  7  8  9  10  11   

Собираюсь писать ВК для 1С на C#

Ø [длинная ветка, 21.12.20 - 20:41]
Собираюсь писать ВК для 1С на C#
Я
   Гений 1С
 
11.12.20 - 19:44
Пример буду брать из "Технологии внешних ВК" на ИТС.
Вопрос такой - где брать платформу C# (IDE)?

По сути, мне надо обертку над DLL писать.
Раньше ее писал на VB6, но пора переходить на C#, у производителя оборудования пример на C#, кроме того нужна версия компоненты на 32 и 64 разряда.
   Кирпич
 
901 - 21.12.20 - 15:49
Ну Гений у нас такие сложные программы не пишет. Ему это не грозит.
   H A D G E H O G s
 
902 - 21.12.20 - 15:50
Меня позабавила проверка
Если Высота*Ширина=0 Тогда
Выход;

Г-но код есть не только в 1С
   Кирпич
 
903 - 21.12.20 - 15:52
(902)А чо такого?. Ну сократили малость писанины
   Гений 1С
 
904 - 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;
            }

        }
    }
}
   Гений 1С
 
905 - 21.12.20 - 15:58
(890) прописал, использовал онлайн-конструктор ГУИД
   Кирпич
 
906 - 21.12.20 - 16:00
(904) //как убрать "AddIn.AnvizCCH" из памяти
Сирожка, это .NET. Он нихера не выгружает без бубна. Пиши на С++
Serginio1 может знает.
   Кирпич
 
907 - 21.12.20 - 16:02
Хотя может просто Неопределено присвоить объекту в 1с
   Garykom
 
908 - 21.12.20 - 16:02
   acht
 
909 - 21.12.20 - 16:03
Скажите, а "Собираюсь писать ВК для 1С на C#. Часть 2" будет?
Ну как с проепаным ноутбуком?
   Кирпич
 
910 - 21.12.20 - 16:04
(909) Будет. Можешь смело продавать билеты. Вы там всем колхозом в кинотеатре смотрите?
   Кирпич
 
911 - 21.12.20 - 16:06
catch(IndexOutOfRangeException ex)  - это от китайцев скопипастил или сам придумал?
   H A D G E H O G s
 
912 - 21.12.20 - 16:07
Сергей собирает ВК
https://youtu.be/8HZ4DnVfWYQ
   Кирпич
 
913 - 21.12.20 - 16:08
ту хелп ёр бизнес
   Гений 1С
 
914 - 21.12.20 - 16:11
   Гений 1С
 
915 - 21.12.20 - 16:11
(909) будет, будет. ;-) я ж работаю
   Serginio1
 
916 - 21.12.20 - 16:12
(904) Никак. Но зачем ты тестишь через 1С? Создай какой нибудь WinForms и отлаживайся напрямую
   Serginio1
 
917 - 21.12.20 - 16:12
   Гений 1С
 
918 - 21.12.20 - 16:13
(916) я так VB тестил. А как через WinForms?
   Ненавижу 1С
 
919 - 21.12.20 - 16:13
так, конструкторы уже появились... это уже немножко ООП начинается, а говорили не будет порнографии
   H A D G E H O G s
 
920 - 21.12.20 - 16:13
(918) Да ладно.
   H A D G E H O G s
 
921 - 21.12.20 - 16:14
Я так понимаю, G1C открывает мыльную оперу, судя по (918)
   Кирпич
 
922 - 21.12.20 - 16:14
(914) Я так понял, ты там ничо не смотрел.
   Кирпич
 
923 - 21.12.20 - 16:15
или не понял
   Serginio1
 
924 - 21.12.20 - 16:15
(918)  В этом же проекте добавь еще один проект WiForms. Добавь в ссылки отлаживаемый проект . Кинь на форму кнопку, двойной щелчок и напиши вызов
   Кирпич
 
925 - 21.12.20 - 16:16
(924) А в консольке нельзя чтоли?
   Serginio1
 
926 - 21.12.20 - 16:17
   Serginio1
 
927 - 21.12.20 - 16:18
(925) Фи консолька, это не путь визуальщика. Это любители С++ любят консольки.
Можно конечно
   Гений 1С
 
928 - 21.12.20 - 16:19
(924) Вызов типа создать COM-объект?
   Гений 1С
 
929 - 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) Прочитай сообщение об ошибке еще раз
 
 Рекламное место пустует
   Serginio1
 
931 - 21.12.20 - 16:21
(928) Ты до вызова создать COM-объект отладь то, что хочешь сделать. А потом уже переноси на 1С.
Dll должна быть вместе с проектом. Добавь её в проект и проставь копировать в каталог
   Гений 1С
 
932 - 21.12.20 - 16:21
(930) кстати, в NET можно положить tc-b_new_sdk.dll рядом с AnvzCCH.dll, а не кидать ее в каталог винды, мило.
   Гений 1С
 
933 - 21.12.20 - 16:22
(931) что значит "копировать в каталог"?
   Кирпич
 
934 - 21.12.20 - 16:22
(933) мышкой перетащить
   Serginio1
 
935 - 21.12.20 - 16:23
Или ручками в нужный каталог
(933) Ну в каталог где запускается приложение в зависимости Release Debug
   Serginio1
 
936 - 21.12.20 - 16:24
   Кирпич
 
937 - 21.12.20 - 16:24
(932) "кстати, в NET можно положить tc-b_new_sdk.dll рядом с AnvzCCH.dll, а не кидать ее в каталог винды, мило."
Ахиреть просто. :)
   Garykom
 
938 - 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
   H A D G E H O G s
 
941 - 21.12.20 - 16:36
(939) Она ищет почти везде, не давая права на ошибку, но у нас Сергей.
https://www.gunsmoker.ru/2015/11/do-not-use-LoadLibrary.html
   Гений 1С
 
942 - 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) Посмотри в гугле
   Serginio1
 
945 - 21.12.20 - 16:44
наверное new AnvizCCH.AnvizCCH(); если ты его к проекту подключил. Ты опять не читаешь, что я тебе пишу, а поступаешь так как сам понимаешь.
   Serginio1
 
946 - 21.12.20 - 16:45
(942 ты хоть GUID то прописал?
   Serginio1
 
947 - 21.12.20 - 16:49
(942) Мыши кололись
Type t = Type.GetTypeFromProgID(progID);
object obj = Activator.CreateInstance(t);

Но зачем тебе СО если ты можешь работать с типом напрямую?
Все ухожу!
   Гений 1С
 
948 - 21.12.20 - 16:50
(945) в сборке сделал два проекта, один с формами, другой с COM
using AnvizCCH; - пишет, что не найдено пространство имен или сборка
   Гений 1С
 
949 - 21.12.20 - 16:51
Спасибо, получилось, просто добавил ссылку на проект COM в проект Форм.
   Гений 1С
 
950 - 21.12.20 - 16:52
О, даже отладка работает, как мило. ;-)
   Кирпич
 
951 - 21.12.20 - 16:53
(949) Слава богу. А то Serginio1 уже за сердце схватился
   Гений 1С
 
952 - 21.12.20 - 17:00
Странно, включил dll в проект, но при обращении к функции DLL не находит VS эту DLL, а вот 1С находит. ЧЯДНТ?
   Кирпич
 
953 - 21.12.20 - 17:01
linq
   Гений 1С
 
954 - 21.12.20 - 17:03
(953) что linq?
   Кирпич
 
955 - 21.12.20 - 17:04
(954) Это я Serginio вызываю
   Кирпич
 
956 - 21.12.20 - 17:05
положи уже dll куда надо и не парься. В каталог, который есть в path, например
   H A D G E H O G s
 
957 - 21.12.20 - 17:07
(956) "Что такое path" © Г1С
   Serginio1
 
958 - 21.12.20 - 17:16
(952) Положи нативную Dll в исполняемый проект, что бы она копировалась в нужный катало
Добавь ссылку на проект твоей C# библиотеки в исполняемый проект
https://docs.microsoft.com/ru-ru/visualstudio/ide/managing-references-in-a-project?view=vs-2019
   Serginio1
 
959 - 21.12.20 - 17:17
   Garykom
 
960 - 21.12.20 - 17:24
(952) бывает
 
 Рекламное место пустует
   Garykom
 
961 - 21.12.20 - 17:24
(957) ыыыыы
   Serginio1
 
962 - 21.12.20 - 17:29
(962) Смотри каталог Bin исполняемого проекта, твоя dll должна быть там. По 32 и 64 dll я уже тебе ссылки давал
   Serginio1
 
963 - 21.12.20 - 17:30
   Serginio1
 
964 - 21.12.20 - 18:15
Почитай про статические конструкторы
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
   Ненавижу 1С
 
965 - 21.12.20 - 18:34
(964) ты ему ещё про финализаторы расскажи
   Гений 1С
 
966 - 21.12.20 - 18:44
(962) Положил в каталог, так она ругается: {"Была сделана попытка загрузить программу, имеющую неверный формат. (Исключение из HRESULT: 0x8007000B)"}
   H A D G E H O G s
 
967 - 21.12.20 - 18:50
(966) Кхаб должен страдать
   Serginio1
 
968 - 21.12.20 - 18:51
(966) У тебя наверняка с SDK есть демо на C#. Посмотри, что там и как.
Опять же читаем https://geekhow.ru/os/windows/0x8007000b/
Смотри какой у тебя процесс. Какой разрядности dll.
   Гений 1С
 
969 - 21.12.20 - 18:52
(968) я туда и 32 и 64 кидал DLL, Не алле. При этом в 1С все норм работает, только отлаживать сложно
   Гений 1С
 
970 - 21.12.20 - 18:56
сукко, новый SDK асинхронный, а поставлена задача совместимости, значит, будем таймауты вешать.
   Ненавижу 1С
 
971 - 21.12.20 - 18:59
(970) ты вот к чему этот набор слов сейчас произнёс?
   Кирпич
 
972 - 21.12.20 - 18:59
Кинозал охнул
   Serginio1
 
973 - 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
   H A D G E H O G s
 
974 - 21.12.20 - 19:08
(970) Там же есть callback-и, ведь да, да?
   Serginio1
 
975 - 21.12.20 - 19:11
   Serginio1
 
976 - 21.12.20 - 19:13
   H A D G E H O G s
 
977 - 21.12.20 - 19:20
// Из интервью Сергея, окрестности 2022 года.
https://youtu.be/aHLfyWfeATk
   Кирпич
 
978 - 21.12.20 - 19:24
(975) Не запутывайте пациента
   Кирпич
 
979 - 21.12.20 - 19:29
(970) Ты где там увидел асинхронное, балда?
   Serginio1
 
980 - 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) Да нет. То не то.
   Гений 1С
 
982 - 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 сделать приватным членом класса и инициализировать в конструкторе?
   Гений 1С
 
983 - 21.12.20 - 19:50
(979) да, там асинхронка, кури метод CChex_Update. Он возвращает событие из очереди.
После успешного вызова метода событие может еще туда быть не помещено, нужно ждать. Поэтому и тайм-аут. я ж тебе лог в (978) выслал
   Гений 1С
 
984 - 21.12.20 - 19:52
(973) ну я еще побьюсь, все же удобно в VS отладчике отлаживать. Но если не победю, то будет старая-добрая трассировка, я ею и в VB6 спокойно пользовался.
   Garykom
 
985 - 21.12.20 - 19:54
(983) асинхронка это не таймаут, это когда передаешь адрес свой функции и ее дернут когда будет готово
Callback короче
   Serginio1
 
986 - 21.12.20 - 19:57
(985) async await и event, ContinueWith это немного большее чем примитивный Callback.
   Гений 1С
 
987 - 21.12.20 - 20:01
(985) ну все может быть. Но в общем, разрыв контекста выполнения происходит, да.
   Serginio1
 
988 - 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/
   Garykom
 
989 - 21.12.20 - 20:06
(986) в конечном итоге все сводится к коллбэкам
просто синтаксический сахар наворочен
   Serginio1
 
990 - 21.12.20 - 20:06
Ну или проще использовать waithandle эвенты
https://metanit.com/sharp/tutorial/11.6.php
   Serginio1
 
991 - 21.12.20 - 20:09
(989) Этот синтаксический сахар такой огромный, что в 1С только сейчас до async await доросли. Там и ConfigureAwait и много чего.
В итоге все сводится не к одному вызову а огромной куче вызовов, создания замыкания и автомата
   Гений 1С
 
992 - 21.12.20 - 20:13
(990) у меня этого слава богу нет.
   Кирпич
 
993 - 21.12.20 - 20:18
(983) Ну да. Получается асинхронно. В примере по таймеру выгребаются все сообщения и обрабатываются. Все кишки в одном методе. Китайцы.
   Гений 1С
 
994 - 21.12.20 - 20:20
(993) хоть указатель на функцию юзай. ;-)
   Кирпич
 
995 - 21.12.20 - 20:23
Мож оно там где нибудь переключается на синхрон
   Serginio1
 
996 - 21.12.20 - 20:27
(994) AutoResetEvent waitHandler.WaitOne(); ContinueWith waitHandler.Set();
   Гений 1С
 
997 - 21.12.20 - 20:27
Учитывая, что ветка становится длинной и подходит к "логическому концу", резюмирую: вот благодаря таким задачам я понимаю, что я - "победитель по жизни". Взять абсолютно чуждую мне задачу, найти ресурсы и помощь, разобраться, решить и в конечном итоге прийти к результату, попутно написав пару статей, чтобы другим проще было топать по проторенному пути.
Мой фирменный "Гений-Стайл".
   H A D G E H O G s
 
998 - 21.12.20 - 20:33
   Кирпич
 
999 - 21.12.20 - 20:37
(997) Лучше бы ты разобрался молча, написал бы свои статьи (не знаю кто эту пургу читает), а не вываливал на весь свет своё колхозное величие и некомпетентность.
   Кирпич
 
1000 - 21.12.20 - 20:38
the end
  1  2  3  4  5  6  7  8  9  10  11   

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.