|
Пишу COM-ВК для 1C на С# | ☑ | ||
---|---|---|---|---|
0
Гений 1С
гуру
23.12.20
✎
14:11
|
Возникло пару вопросов к уважаемому ALL по материалам ветки: Собираюсь писать ВК для 1С на C#
Почему то при обращении COM-объекта к DLL-библиотеке ANVIZ NET ожидает встретить 32 или 64-разрядную dll библиотеку tc-b_new_sdk.dll в папке рядом с моей компонентой AnvizCCH.dll. Иначе пишет, что попытка запустить плохой файл. Как сделать универсально, чтобы в зависимости от системы запускался тот или иной файл DLL. AnvizCCH.dll зарегистрировал через regasm и для 32 и для 64. В C# коде связывание tc-b_new_sdk.dll по имени tc-b_new_sdk Я пока вижу только переименовать в tc-b_new_sdk32 и tc-b_new_sdk64 и сделать два проекта для 32 и 64 разрядных ОС. Но это как-то криво. Можно проще как-то? P.s: и как убрать мигающую елку справа, закрывает окно написания поста? |
|||
4
Serginio1
23.12.20
✎
14:17
|
Я тебе уже кучу раз ссылки давал на это
Собираюсь писать ВК для 1С на C# |
|||
5
Serginio1
23.12.20
✎
14:18
|
||||
6
Serginio1
23.12.20
✎
14:19
|
Там несколько вариантов почитай про делегаты
https://metanit.com/sharp/tutorial/3.13.php |
|||
7
Serginio1
23.12.20
✎
14:21
|
Но проще через SetDllDirectory
Смотри как сделано в SDK |
|||
8
Serginio1
23.12.20
✎
14:22
|
И про статические конструкторы вспомни тоже ссылки давал
|
|||
9
УдавВПопугаях
23.12.20
✎
14:22
|
нууу так не интересно, в век капитализма и рыночных отношений
|
|||
10
Гений 1С
гуру
23.12.20
✎
14:27
|
(5) ок, гляну.
|
|||
11
Garykom
гуру
23.12.20
✎
14:43
|
(0) 1. не тупи и делай разные версии 32 и 64
|
|||
12
Garykom
гуру
23.12.20
✎
14:43
|
(11)+ потому что http://rsdn.org/forum/dotnet/1000458.all не освоишь
2. Елка убирается так же как и реклама |
|||
13
Serginio1
23.12.20
✎
14:45
|
(11) Не надо. Просто 2 папки для 32 и 64 разрядных нативных библиотек.
|
|||
14
Serginio1
23.12.20
✎
14:47
|
Если одна библиотека то просто
static class MyDll { static MyDll() { var myPath = new Uri(typeof(MyDll).Assembly.CodeBase).LocalPath; var myFolder = Path.GetDirectoryName(myPath); var is64 = IntPtr.Size == 8; var subfolder = is64 ? "\\win64\\" : "\\win32\\"; LoadLibrary(myFolder + subfolder + "MyDll.dll"); } [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("MyDll.dll")] public static extern int MyFunction(int var1, int var2); } |
|||
15
Serginio1
23.12.20
✎
14:49
|
Смотри статический конструктор, он выполняется раньше всех. В данном случае загружается нужная библиотека, а затем уже ищутся методы в загруженной библиотеке
|
|||
16
H A D G E H O G s
23.12.20
✎
14:54
|
Кхаб должен страдать.
|
|||
17
Гений 1С
гуру
23.12.20
✎
17:00
|
(14) спасибо, попробую. Отчитаюсь тут
|
|||
18
acht
23.12.20
✎
17:14
|
(17) > Отчитаюсь тут
А может не надо, а? |
|||
19
Garykom
гуру
23.12.20
✎
17:34
|
(18) нет уж сразу на боевых серваках клиентов пусть пробует - во они обрадуются когда их сервера попадают
|
|||
20
Ненавижу 1С
гуру
23.12.20
✎
18:02
|
(19) в ларьках нет серверов
|
|||
21
Гений 1С
гуру
23.12.20
✎
19:41
|
(20) (19) вот-вот, какие сервера, от чего попадают? ;-) Прям Скайлинк и Терминатор
|
|||
22
Йохохо
23.12.20
✎
20:16
|
(21) Скайлинк
i am your father, Manhole |
|||
23
NorthWind
23.12.20
✎
21:43
|
Скайлинк? Это пров сотовой связи такой был лет 15 назад.
При чем он тут? |
|||
24
TormozIT
гуру
23.12.20
✎
22:35
|
О, уже второй сезон сериала =)
|
|||
25
Serginio1
25.12.20
✎
12:32
|
(17)>> Отчитаюсь тут
Сергей как успехи? Как продвижение в изучении и реализации C#. Есть вопросы? Волнуемся, переживаем! Чем помочь? |
|||
26
Garykom
гуру
25.12.20
✎
13:01
|
(25) Можно ли управляемый код на C# вызывать из неуправляемого на C++ ?
|
|||
27
Garykom
гуру
25.12.20
✎
13:02
|
(26)+ без реализации COM сервера, обычная c-shared DLL
|
|||
28
Ненавижу 1С
гуру
25.12.20
✎
13:11
|
||||
29
Garykom
гуру
25.12.20
✎
13:38
|
(28) хмм получается ну да таким макаром можно на C# ваять Native API ВК для 1С
через прокладку на C++ вызывать сборки на C# |
|||
30
Serginio1
25.12.20
✎
13:43
|
(26) Конечно! Ты забыл про Ъ
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux http://catalog.mista.ru/1c/articles/534901/ Правда я писал еще под под .Net Core 1 Сейчас для .Net Core >3 другой апи https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting |
|||
31
Serginio1
25.12.20
✎
13:49
|
Для некросплатформенного есть https://docs.microsoft.com/ru-ru/cpp/dotnet/mixed-native-and-managed-assemblies?view=msvc-160
Есть вариант взаимодействия через COM "CLR Hosting API" Использование .NET сборок в 1С 8.2, 8.3 без установки и без регистрации в реестре. http://catalog.mista.ru/public/300091/ |
|||
32
Serginio1
25.12.20
✎
13:58
|
||||
33
Garykom
гуру
25.12.20
✎
13:59
|
(30) дык тоже dll прокладка, подразумевал что всего одна dll на C# которую можно вызывать из C++ unmanaged
|
|||
34
Serginio1
25.12.20
✎
14:01
|
(33) Смотри 32
|
|||
35
Serginio1
25.12.20
✎
14:08
|
(33) Все в одном это С++ CLI. Вызов из нативного кода C# DLL это CLR Hosting API и nethost.h и hostfxr.h или CoreClrHost
Все они вызываются и нативного кода. Я просто сделал универсальную прокладку. Для отдельной ты сам можешь написать свою ВК без всяких Ъ |
|||
36
Serginio1
30.12.20
✎
11:22
|
(0) Сергей с наступающим тебя новым годом!
Расскажи о достижениях! |
|||
37
qwerty
30.12.20
✎
11:25
|
(36) - он таки смог поставить Visual Studio
|
|||
38
Garykom
гуру
30.12.20
✎
11:26
|
(37) не ту поставил и не настроил sdk v120
|
|||
39
qwerty
30.12.20
✎
11:33
|
(38) - ужос...
Ждем новый сезон "Гений проводит тонкую настройку Tomcat". Жанр: фильм - катастрофа Трейлер показывали в 2013м году: https://www.youtube.com/watch?v=E3418SeWZfQ |
|||
40
Гений 1С
гуру
30.12.20
✎
11:51
|
(38) поставил последнюю, 2019-ю.
|
|||
41
Гений 1С
гуру
30.12.20
✎
11:52
|
(36) Спасибо. О достижениях рассказываю на Geni1s.ru. Как говорится, "вы еще не слышали о Гение 1С, но скоро вы о нем еще услышите"!
|
|||
42
H A D G E H O G s
30.12.20
✎
12:52
|
||||
43
Serginio1
30.12.20
✎
14:14
|
(42) Ну сам себя не похвалишь, никто не похвалит!
Другое дело, что здесь все Гении. И всех гениев и не только 1С с Новым Годом! И побольше Гениев не только 1С, но и в разных языках, от этого наша страна станет более гениальной. А можем жить согласно нашему гению! |
|||
44
acht
30.12.20
✎
14:22
|
(43) > согласно
Но традиционно таки - вопреки. |
|||
45
Гений 1С
гуру
06.01.21
✎
13:08
|
Возник вопрос с VARIANT и COMSAFEARRAY до кучи (это ж тоже VARIANT)
В VB6 у меня были необязательные параметры методов, они были с типом Variant. Как мне в C# преобразовать их в число или булево? Про массивы еще не дошел, но чую тоже понадобятся. Я передаю из 1С ComsafeArray в параметры методов. |
|||
46
Ненавижу 1С
гуру
06.01.21
✎
13:29
|
(45) ну прочти хоть немного про c#. Хотя ты все еще думаешь, что это диалект Си
|
|||
47
Paint_NET
06.01.21
✎
13:38
|
(46) "А чо его изучать, это тот же Си" © фиксин :)
|
|||
48
H A D G E H O G s
06.01.21
✎
13:39
|
Поставим Сергею хорошую песню
https://youtu.be/9aCxDlh5OOc |
|||
49
H A D G E H O G s
06.01.21
✎
13:43
|
С++ и C# как бэ намекают Сергею, что он ниасилит
https://youtu.be/u0VT75jP-Yo?list=PL46NKry1dUo25uIdsdjl28YNQG0HNumhR&t=981 |
|||
50
Serginio1
06.01.21
✎
14:29
|
(45) Еще раз советую посмотреть класс public class AutoWrap : IReflect
и главное метод public static object ОбернутьОбъект(object obj) и ПолучитьРеальныйОбъект(object obj) .Net сама преобразует для COM и из COM нужные типы https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/type-marshaling |
|||
51
Serginio1
06.01.21
✎
14:36
|
||||
52
ДедМорроз
06.01.21
✎
14:45
|
Variant это структура,где хранятся простые типы и ссылки на сложные.
Соответственно,получаем или значение или ссылку на хранимое значение. Но,нужно не забывать,что для работы со значениями есть свои функции,так как значения требуют выделения и освобождения памяти. |
|||
53
Гений 1С
гуру
06.01.21
✎
15:11
|
(52) вопрос - как это сделать в C#
(50) там фишка в том, что на вход функция COM-Объекта может получать V:Variant, где может быть и число и булево (передаются настройки). Ну и конечно, еще доживу до COMSafeArray, вот там попотеть придется. |
|||
54
Serginio1
06.01.21
✎
17:07
|
(53) Я зачем тебе ссылки даю? Автоматом преобразуются как в одну так и в другую сторону. А вот нетовские объекты и классы не помеченные как комовские нужно преобразовывать через IReflect
|
|||
55
Serginio1
06.01.21
✎
17:12
|
||||
56
Serginio1
06.01.21
✎
17:14
|
Можешь не спрашивать, а смотреть в отладчике, что получаешь
|
|||
57
Garykom
гуру
06.01.21
✎
17:26
|
интересно к концу 2021 осилит?
|
|||
58
Гений 1С
гуру
06.01.21
✎
18:01
|
(55) вот как мне на c# в COM-классе объявить что параметр метода - Variant или массив Variant?
public Test(Variant v) { return (long)v + 1; } Так не работае, например. А если ты хочешь сказать, что он автоматом мне преобразует Variant в long, то что будет, если там будет не long, а string: public Test(long v) { //Как быть если v - string и мне нужно вернуть ее длину (тестово, допустим)? return v + 1; } |
|||
59
Гений 1С
гуру
06.01.21
✎
18:04
|
(56) я вызываю класс из формы на c#, я там тип Variant не создам. А если из 1С вызывать, то можно трассирокой, в принципе (там отладчик не подхватит), но нужно понимать, какой в C# тип параметра объявлять.
|
|||
60
Serginio1
06.01.21
✎
18:12
|
Для начала объяви
public void Test(object v) { // return (long)v + 1; и посмотри какой тип приходит } скорее всего будет public int Test(int v) { return v + 1; } Если из 1С нужно ссоздать объект А затем из студии оттладка- присоединиться к процессу. Ставь точки останова где тебе нужно и смотри |
|||
61
Serginio1
06.01.21
✎
18:16
|
||||
62
Гений 1С
гуру
06.01.21
✎
21:35
|
(60) а как тип посмотреть? object - это встроенный объект? и как задать не обязательный параметр
Test(object v = Null)? |
|||
63
Гений 1С
гуру
06.01.21
✎
21:38
|
но даже если я увижу там int, как мне его получить? ведь там может быть и string?
(int)v (string)v в зависимости от типа v? |
|||
64
Ненавижу 1С
гуру
06.01.21
✎
21:56
|
(62) ты же хвастался, что уже знаешь шарп, а про базовый object не в курсе?
|
|||
65
Serginio1
06.01.21
✎
22:52
|
(62) object это по сути variant любой тип можно привести к object
по типу можно преобразовать к нужному типу. Есть GetType(), is as и switch https://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching Про необязательные параметры и прочее. Прочитай https://metanit.com/sharp/tutorial/2.9.php Это снимет кучу вопросов. Test(object v = null) |
|||
66
Serginio1
06.01.21
✎
22:59
|
Если ты знаешь какой тип передаешь то пиши метод с нужным типом
public int Test(int v) (62) В отладчике vj;yj nbg gjcvjnhtnm https://docs.microsoft.com/ru-ru/visualstudio/debugger/debugger-feature-tour?view=vs-2019 https://docs.microsoft.com/ru-ru/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2019 |
|||
67
ДедМорроз
06.01.21
✎
23:15
|
Object это базовый тип,любой сложный тип(то есть объект)это потомок object.
Но,простые типы,типа int,на самом деле,не есть потомки object. Просто,для них создаётся дополнительный тип,который является объектом,но с одним значением простого типа. Variant же,это структура. Она в object напрямую не переносится. Кроме того,object живёт в пространстве виртуальной машины net,а variant живёт в пространстве процесса,вызывающего код net. Далее, есть специальный интерфейс IMarshal,который передает данные из пространства одного процесса в другой,и в его реализации можно спокойно сделать трансляцию одного в другое. Но,лучше не использовать массивы для передачи,так как трансляция массива не всегда очевидна. Кроме того,в variant могут быть переданы интерфейсы объектов,что для net подсистемы не совсем очевидно. |
|||
68
Гений 1С
гуру
07.01.21
✎
07:33
|
(66) я ж говорю, что не знаю. а вот в (67) пишут, что variant в object не конвертируется...
гм, вроде простые вещи, а вызывают затруднения у корифеев, до всего самому чую доходить придется. (67) интерфейсы я не планирую передавать, только массивы (COMSAFEARRAY) и произвольный тип (VARIANT) |
|||
69
Serginio1
07.01.21
✎
12:46
|
(68) Говорят, что кур доят. Я тебе кучу ссылок давал. Все конвертируется автоматически.
Ты хоть попробовал? COMSAFEARRAY преобразуются к массивам нужного типа в зависимости от типа элемента int[], string[] итд |
|||
70
Кирпич
07.01.21
✎
13:00
|
(69) "Ты хоть попробовал?"
Лучше пусть не пробует. А то гениальность так полыхнет, что таблетки придется пить. |
|||
71
Serginio1
07.01.21
✎
13:04
|
Для проверки сделай 2 метода
public string[] TestGetArray() { return new string[]{первый, второй, третий}; } public void TestSetArray( object array) { var i=0; // cnfdm njxre jcnfyjdf } из 1С мас=Новый COMSafeArray("VT_I1",1); мас.SetValue(0,127); нетобъект.TestSetArray(мас); |
|||
72
Serginio1
07.01.21
✎
13:05
|
ну скобки забыл поставить
{"первый", "второй", "третий"}; И cnfdm njxre jcnfyjdf это ставь точку останова |
|||
73
ДедМорроз
07.01.21
✎
13:23
|
Так 1с передает Array с типом vt_variant,так что там немного сложнее.
С другой стороны,array of object тоже вполне себе жилец. И я нигде не писал,что не конвертируется,я просто объяснял,что преобразования достаточно непрозрачные,так как адресные пространства разные. Ну и windows для типа variant точно также использует сериализации,только для этого есть специальный интерфейс,так как можно захотеть сериализовать свои интерфейсы. Но,1с умеет только IDispatch,так что лезть в дебри бессмысленно. |
|||
74
Serginio1
07.01.21
✎
13:35
|
(73) Адресные пространства одинаковы. Среда .Net Jit ит все в нативный код.
Для ком создаются оболочки которые отвечают не только за конвертацию но и за подсчет ссылок https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/com-wrappers ну и таблица преобразования variant https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/customize-struct-marshaling#marshal-systemobject |
|||
75
ДедМорроз
07.01.21
✎
19:33
|
У среды .Net свое адресное пространство.
То,что система делает преобразование - это понятно. Только преобразование - это потеря производительности. |
|||
76
Serginio1
07.01.21
✎
20:32
|
(75) >> У среды .Net свое адресное пространство.
Можно ссылочку на такие заявления? Адресное пространство тоже. http://catalog.mista.ru/1c/articles/448668/ Вот здесь замер скорости, всего в 2.25 раза медленнее обычного 1С метода. Если бы был межпроцессный маршалинг, вызов бы был в сотни раз медленнее. Опять же при отладке подключаемся к процессу 1С, а не какому ни будь суррогату. |
|||
77
Гений 1С
гуру
07.01.21
✎
20:35
|
(69) с массивом попробую. Но у меня есть и просто параметр (не массив) Variant, Который может быть int и boolean. Как тут быть?
|
|||
78
Serginio1
07.01.21
✎
20:39
|
76+ Суть не в скорости, а в возможностях. ВК то нужны для расширения возможностей 1С
Если нужна скорость можно заполнять объекты 1С из .Net |
|||
79
Serginio1
07.01.21
✎
20:45
|
(77) Еще раз
public void TestVariant( object variant) { var i=0;// ставь точку останова и смори какой тип } если передаешь любой тип то ссылку на преобразование типов я тебе уже давал https://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching Кроме того, если бы наконец то соизволил посмотреть код ще раз советую посмотреть класс public class AutoWrap : IReflect и главное метод public static object ОбернутьОбъект(object obj) То там сравтение типов public static object ОбернутьОбъект(object obj) { if (obj != null) { Type Тип = obj.GetType(); if (Тип==typeof(System.IntPtr) || Тип==typeof(System.UIntPtr)) return new AutoWrap(obj); if (Тип == typeof(System.Char)) return System.Convert.ToString(((char)obj)); if (ЭтоСемерка) { if (Тип == typeof(System.Decimal)) return ((Decimal)obj).ToString(CultureInfo.InvariantCulture); if (Тип.IsPrimitive) { if ((Тип == typeof(System.Int64) || Тип == typeof(System.UInt32) || Тип == typeof(System.UInt64) || Тип == typeof(System.UInt16) || Тип == typeof(System.SByte))) obj = Convert.ChangeType(obj, typeof(string), CultureInfo.InvariantCulture); } else if (!(Тип == typeof(System.DateTime) || Тип == typeof(System.String) || Тип == typeof(System.Decimal) || Тип.IsCOMObject) ) obj = new AutoWrap(obj); } else { if (Тип.IsArray) { Type ТипМассива = Тип.GetElementType(); if (ТипМассива != null) Тип = ТипМассива; } if (!(Тип.IsPrimitive || Тип == typeof(System.Decimal) || Тип == typeof(System.DateTime) || Тип == typeof(System.String) || Тип.IsCOMObject) ) obj = new AutoWrap(obj); } } return obj; } |
|||
80
Serginio1
07.01.21
✎
20:46
|
Я тебе ссылки не зря даю. Там все конкретно есть по твоим вопросам. Ты бы уже давно мог все проверить и написать кучу тестов
|
|||
81
Гений 1С
гуру
07.01.21
✎
20:57
|
(79) о, вот это то что нужно вроде. сегодня COM не ковырял, завтра буду, проверю на деле. Спасибо. ;-)
|
|||
82
Гений 1С
гуру
07.01.21
✎
20:57
|
(80) Завтра буду тестить. Спасибо.
|
|||
83
H A D G E H O G s
07.01.21
✎
21:36
|
Сергей вдупляет в ComSafeArray, внутри которого передаются из 1С в ВК параметры вызванного метода, я же правильно понимаю?
|
|||
84
Гений 1С
гуру
07.01.21
✎
22:03
|
(83) не уверен, что я правильно понимаю, о чем ты спрашиваешь.
|
|||
85
Serginio1
07.01.21
✎
22:32
|
(84) Наверное ты решил сделать всетаки ВК?
И использовать ILanguageExtender? ILanguageExtender { ...... void CallAsProc(int lMethodNum, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParams); void CallAsFunc(int lMethodNum, ref object pvarRetValue, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParam); } Зачем тебе ВК непонятно. COM вполне достаточно Если хочешь получить параметры смотри https://docs.microsoft.com/ru-ru/dotnet/api/system.array?view=net-5.0 Опять же смотри NetObjetToIDispatch45 там есть класс ВК GlobalContext1C : IInitDone, ILanguageExtender |
|||
86
H A D G E H O G s
07.01.21
✎
22:33
|
Вот так это делается у нас, в Дельфи
function TBaseVKObject.GetParamAsInt64(lIndex: integer): int64; var varGet: OleVariant; begin SafeArrayGetElement(g_Params, lIndex, varGet); try result := varGet; except ErrorCode := -1 * (lIndex + 1); Raise Exception.Create('Параметр номер ' + inttostr(lIndex + 1) + ' не может быть преобразован в целое 8-ми байтовое беззнаковое.'); end; end; |
|||
87
Serginio1
07.01.21
✎
22:38
|
(86) Эх я на Паскале Delphi лет 25 писал, но увы .Net больше возможностей.
Но ностальгирую (84) Еще посмотри http://rsdn.org/forum/dotnet/2213356.1 |
|||
88
Serginio1
07.01.21
✎
22:42
|
Кстати про маршалинг массивов
https://docs.microsoft.com/ru-ru/dotnet/framework/interop/default-marshaling-for-arrays (86) В .Net так public void CallAsFunc(int lMethodNum, ref object pvarRetValue, ref System.Array paParams) { //Здесь внешняя компонента выполняет код функций. // switch(lMethodNum) //Порядковый номер метода { case (int)Methods.methShowErrorLog: //Реализуем метод для показа сообщения об ошибке { string s1; s1 = (string)paParams.GetValue(0); |
|||
89
Гений 1С
гуру
08.01.21
✎
07:22
|
(85) нет, я не буду делать ВК, я остаюсь с COM
|
|||
90
rphosts
08.01.21
✎
07:28
|
(89) старого пса нельзя научить новым фокусам
|
|||
91
Гений 1С
гуру
08.01.21
✎
07:31
|
(90) просьба не оффтопить в тематической ветке
|
|||
92
rphosts
08.01.21
✎
08:12
|
(91) ок, но и ты не оффтопь
|
|||
93
Гений 1С
гуру
08.01.21
✎
08:24
|
(92) в этой ветке я пишу сугубо про COM
|
|||
94
УдавВПопугаях
08.01.21
✎
09:35
|
так если просто ком, то зачем ленгвиджекстендер маршаллинг и остальное
|
|||
95
УдавВПопугаях
08.01.21
✎
09:36
|
для просто кома достаточно сделать саму длл комвидимой и интерфейс один/два/сколько надо, регать в реестре и использовать, больше ничего
|
|||
96
Гений 1С
гуру
08.01.21
✎
11:50
|
(94) потому что в параметры передается из 1С и в 1С ComSafeArray
|
|||
97
Гений 1С
гуру
08.01.21
✎
11:50
|
Робята, скажите, часто в функциях объявляю буфер:
IntPtr pBuff; int len = 32000; pBuff = Marshal.AllocHGlobal(len); Могу я его вынести в функцию, чтобы он там выделялся, а удаляться будет при удалении переменной pBuff? |
|||
98
jbond
08.01.21
✎
12:18
|
(97) зачем здесь делать рефакторинг единственого вызова?
Это какой язык? Если си или кресты - то можно попытаться сделать макро. Но опять же - зачем? |
|||
99
Гений 1С
гуру
08.01.21
✎
12:19
|
Гм, вот счас мне надо в 1С вернуть массив строк, на Басик-зольдатен я просто возвращал массив, созданный DIM, и она маршаллировал в COMSAFEARRAY, посмотрим, что в Шарпе будет
|
|||
100
Гений 1С
гуру
08.01.21
✎
12:20
|
(98) есть десяток функций, каждая из них вызывает функцию обработки очереди сообщений, которая возвращает сообщение.
сообщение нужно разместить в неком буфере. я бы не против чтобы функция обработки очереди сообщений создавала этот буфер, но он не сотрется при выходе из функции? Надо попробовать, в принципе. |
|||
101
Serginio1
08.01.21
✎
12:26
|
||||
102
Serginio1
08.01.21
✎
12:27
|
||||
103
Кирпич
08.01.21
✎
12:27
|
(100) Ты лучше позаботься о том, чтобы выделенную память вернуть обратно.
|
|||
104
Кирпич
08.01.21
✎
12:29
|
А то твоя супергениальная система проработает полчаса и сожрет всю память на компьютере
|
|||
105
Serginio1
08.01.21
✎
12:53
|
||||
106
Гений 1С
гуру
08.01.21
✎
13:17
|
(103) деструктор удаляет автоматом
|
|||
107
Гений 1С
гуру
08.01.21
✎
13:28
|
(101) гм, спасибо, будем чистить: Marshal.FreeHGlobal
|
|||
108
Гений 1С
гуру
08.01.21
✎
13:51
|
(105) Sukko, работает! я сделал pBuff приватной переменной класса COM-объекта и выделяю ей память лишь раз, в конструкторе.
|
|||
109
Гений 1С
гуру
08.01.21
✎
13:51
|
Вот кстати, там есть блок функций строковых простейших.
Можно ли их запихнуть в отдельный модуль, чтобы глаз не мозолили? Или надо оформлять класс какой-либо, просто модуль функций нельзя? |
|||
110
H A D G E H O G s
08.01.21
✎
13:54
|
Щас Г1С откроет для себя строковые ресурсы.
|
|||
111
ДедМорроз
08.01.21
✎
13:59
|
А что мы хотим получить?
Зачем мы выделяем память,а не создаём объекты,которые будут управляться сборщиком мусора. Кроме того,если мы создаём память для работы с Com,то по правильному нужно использовать интерфейс IMalloc,иначе возможны проблемы с выполнением программы,которые очень сложно отловить. Для 1с проще при возврате в 1с возвращать не массив,а строку,из которой уже в 1с получится массив через ЗначениеИзСтрокиВнутр,по крайней мере,будет намного меньше преобразований. |
|||
112
ДедМорроз
08.01.21
✎
14:01
|
А чем статические члены класса отличаются от просто функций?
|
|||
113
Гений 1С
гуру
08.01.21
✎
14:09
|
Есть еще вопрос.
В зависимости от типа устройства там создаются два типа записей: record_info = (AnvizNew.CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID)); record_info = (AnvizNew.CCHEX_RET_RECORD_INFO_STRU)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_RECORD_INFO_STRU)); А дальше код одинаковый. Можно как-то совместить эти две структуры в одну переменную, чтобы далее писать идентичный код. Они объяляются по-разному: AnvizNew.CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID record_info; AnvizNew.CCHEX_RET_RECORD_INFO_STRU record_info; Нельзя привязать к общему типу? |
|||
114
Serginio1
08.01.21
✎
14:13
|
(112) Нет ссылки на this/
(109) Все зависит от декомпозиции. Иногда огромный метод проще выделить в отдельный класс с выделением часто иcпользуемых переменных в поля класса и разбивкой на множество методов. Это позволяет проще читать. Можно разбить класс на несколько файлов используя partial https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods Кроме того можно расширить методы класса через расширения https://metanit.com/sharp/tutorial/3.18.php |
|||
115
Гений 1С
гуру
08.01.21
✎
14:18
|
(114) не, ну а просто библиотеку функций как забацать? Я не хочу чтобы функции болтались в классе, проще их в отдельный модуль закинуть. они по сути не от этого класса, там разные конвертации - байты в строки и т.п.
|
|||
116
Serginio1
08.01.21
✎
14:21
|
(113) нужно смотреть.
Можно попробовать через наследование https://docs.microsoft.com/ru-RU/dotnet/api/system.runtime.interopservices.marshal.ptrtostructure?view=net-5.0 и [StructLayout(LayoutKind.Sequential)] Если не нужно заполнять новые поля то можно использовать базовый. Но ты не на тот форум пишешь. Я то ухожу. А кроме меня тут тебе никто особо то и не помогает. (115) Делай как хочешь. У тебя куча инструментов. Используй как твоему гению угодно! Это же творчество! |
|||
117
Гений 1С
гуру
08.01.21
✎
14:24
|
(116) да я то и делаю. ;-)
блин, кривовато, что с двумя одинакомывми классами нельзя работать по именам свойств, абыдно, Но не критично. |
|||
118
Serginio1
08.01.21
✎
14:28
|
(117) Ну можешь использовать привычный тебе dynamic https://metanit.com/sharp/tutorial/9.1.php
Если скорость не критична |
|||
119
Serginio1
08.01.21
✎
14:29
|
Но лучшая практика это интерфейсы https://metanit.com/sharp/tutorial/3.9.php
|
|||
120
zavsom
08.01.21
✎
14:40
|
(0) Серега я в марте купил 32 биткоина и 70 эфиров сейчас я даже посчитать боюсь сколько это денег стоит
|
|||
121
zavsom
08.01.21
✎
14:41
|
детишки программишки давайте дружненько умножим 41500 баксов на 32 = ? а 1250 $ * 70 = ? у меня ладошки потеют
|
|||
122
zavsom
08.01.21
✎
14:45
|
правда есть один маленький ньюансик - вывести ничего нельзя :(
|
|||
123
УдавВПопугаях
08.01.21
✎
14:56
|
(122) а что за прикол, не в теме
|
|||
124
Гений 1С
гуру
08.01.21
✎
15:02
|
(120) харе оффтопить.
УУУУУУУУУУУУУУУУУУУУРРРРРРРРРРРРРРРАААААААААААААА! В компоненте просто метод возвращает object[], 1С видит его как ComsafeArray, подозреваю и обратное верно. То бишь без всяких плясок с бубнами и вариантов маршаллируется. |
|||
125
ДедМорроз
08.01.21
✎
15:14
|
Разбираться с преобразованиями имеет смысл,если хочется повысить производительность и избежать преобразования.
Просто, object[] у тебя будет в памяти,управляемой сборщиком мусора,а результат,передаваемый в 1с будет в памяти,управляемой через IMalloc. |
|||
126
Ненавижу 1С
гуру
08.01.21
✎
15:23
|
(113) не увидел объявлений типа
|
|||
127
Гений 1С
гуру
08.01.21
✎
16:07
|
(126)
public struct CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID { public uint MachineId; //机器号 public byte NewRecordFlag; //是否是新记录 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 28)] public byte[] EmployeeId; // [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Date; //日期时间 public byte BackId; //备份号 public byte RecordType; //记录类型 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] WorkType; //工种 (ONLY use 3bytes ) public byte Rsv; public uint CurIdx; //add VER 22 public uint TotalCnt; //add VER 22 } public struct CCHEX_RET_RECORD_INFO_STRU { public uint MachineId; //机器号 public byte NewRecordFlag; //是否是新记录 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 5)] public byte[] EmployeeId; // [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] Date; //日期时间 public byte BackId; //备份号 public byte RecordType; //记录类型 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] WorkType; //工种 (ONLY use 3bytes ) public byte Rsv; public uint CurIdx; //add VER 22 public uint TotalCnt; //add VER 22 } |
|||
128
Гений 1С
гуру
08.01.21
✎
16:08
|
(125) да ладно, нормально и так. тонкая оптимизация стоит других денег. там можно шарписта нанять, передав уже готовый код
|
|||
129
Serginio1
08.01.21
✎
16:32
|
(125) Через COM особо то и не получится. Там https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/com-wrappers
создается прокси Среда выполнения также создает вызываемую оболочку COM (CCW) для работы в обратном направлении, когда COM-клиенту требуется вызвать метод для объекта .NET. Как показано на следующем рисунке, класс-оболочка, который создается средой выполнения, зависит от контекста вызывающего кода. Общие сведения об оболочках COM В большинстве случаев стандартная вызываемая оболочка времени выполнения или вызываемая оболочка COM, создаваемая средой выполнения, реализует маршалинг вызовов, которые выполняются между средами выполнения COM и .NET. С помощью настраиваемых атрибутов при необходимости можно определить способ представления управляемого и неуправляемого кода в среде выполнения. Суть оболочки в неизменяемости адреса объекта (сборка мусора), подсчет ссылок и маршалинг данных. Для ускорения передавай IntPtr и преобразуй PtrToStructure или другими способами. Но из 1С это не сделать |
|||
130
Гений 1С
гуру
08.01.21
✎
16:34
|
(129) ну тогда и не надо. счас еще доковыряю параметры разного типа. Попробую реализовать через объявления одинаковых процедуры но с разным типом параметров.
|
|||
131
Serginio1
08.01.21
✎
16:36
|
(127) Сделай их классами с [StructLayout(LayoutKind.Sequential)] и пришпандорь интерфейс.
Класс нужен, что бы не боксить структуру https://stackoverflow.com/questions/3032750/structs-interfaces-and-boxing |
|||
132
Гений 1С
гуру
08.01.21
✎
16:56
|
(131) а через макросы никак? (препроцессор)?
|
|||
133
Кирпич
08.01.21
✎
16:57
|
(128) Опытному шарписту твой готовый код нафиг не нужен. Разве что поржать. Смесь китайского копипаста и первый опыт инстаграмщицы в программировании.
.NET удивителен. Вроде всё красиво и всё есть. А как доходит дело до реальных задач так и начинается куча гемора и латки-заплатки с квадратными скобками, маршалингом-хреналингом. Вся красота исчезает напрочь. |
|||
134
Гений 1С
гуру
08.01.21
✎
16:57
|
(133) ну COM изначально был франкенштейном
|
|||
135
Кирпич
08.01.21
✎
16:59
|
(134) COM в Delphi надо писать. Там красиво и быстро получается.
|
|||
136
Serginio1
08.01.21
✎
17:12
|
(133) У тебя извращенное чувство красоты. C# и атрибуты прекрасно дополняют и делают язык очень мощным.
Помогает без проблем интегрироваться с любыми системами, языками. (135) Поверь я писал 20 лет на Delphi, и C# значительно мощнее и во многих случаях проще. После введения ref struct https://docs.microsoft.com/ru-ru/dotnet/csharp/write-safe-efficient-code и новыми компиляторами скорость выполнения приближается к C++ коду (это и без .Net Native) (134) COM изначально был кроссязыковым инструментом. Подсчет ссылок, правило вызова методов, VMT и прочее используется во всех компиляторах. Это просто стандарт. Другое дело, что есть монструозные интерфейсы, но это не проблема COM |
|||
137
Garykom
гуру
08.01.21
✎
17:13
|
(133) Хм как это ни странно но да крутой ООП на практике нифига не красив, сплошные костыли и куча легаси.
Постоянные переписки (заранее все сложно предусмотреть) превращают все в дикий ужас ну или постоянно рефакторить. Банальная функциональщина часто лучще |
|||
138
Гений 1С
гуру
08.01.21
✎
17:19
|
(136) уже одно то, что в Дельфи поскаль с его беган-енд убивает красоту.
|
|||
139
Ненавижу 1С
гуру
08.01.21
✎
17:21
|
(131) опасно
|
|||
140
Ненавижу 1С
гуру
08.01.21
✎
17:22
|
(132) нет (почти) макросов в .NET
|
|||
141
Ненавижу 1С
гуру
08.01.21
✎
17:24
|
(138) то есть в 1С КонецЕсли не убивает?
|
|||
142
Гений 1С
гуру
08.01.21
✎
17:25
|
(141) в 1с конец если из бейсика. это несколько другое. но Си конечно, красивее бейсика и паскаля. Лаконичнее
|
|||
143
Кирпич
08.01.21
✎
17:26
|
(138) Не об этой красоте речь
|
|||
144
Гений 1С
гуру
08.01.21
✎
17:26
|
(133) ты в упор читать не умеешь. Отдать на рефакторинг за деньги. Было ж написано.
|
|||
145
Serginio1
08.01.21
✎
17:27
|
(133) Тот же C# поддерживает функциональщину. Один Linq чего стоит. И pattern matching.
Для примера Code First и Linq to EF на примере 1С версии 8.3. Часть II http://catalog.mista.ru/1c/articles/402038/ Linq to ODATA http://catalog.mista.ru/1c/articles/403524/ Внутри Linq To SQL используются деревья выражений. Мощная штука https://docs.microsoft.com/ru-ru/dotnet/csharp/expression-trees |
|||
146
Ненавижу 1С
гуру
08.01.21
✎
17:27
|
(142) "это другое, понимать надо" (с)
|
|||
147
Ненавижу 1С
гуру
08.01.21
✎
17:29
|
(145) по поводу деревьев:
читал вчера https://habr.com/ru/company/jugru/blog/423891/ вроде и сделали прекрасный инструмент, но одновременно и нагородили себе чем заняться |
|||
148
Кирпич
08.01.21
✎
17:31
|
(145) Да микрософт и слона скоро в C# запихнет. Тебе на радость. И так уже страшнее С++
|
|||
149
Гений 1С
гуру
08.01.21
✎
17:32
|
(140) ну что-то вроде директив препроцессора.
например у меня есть две структуры str и str_new с полями А и B. Тогда если мне надо написать код: string res = my.A + my.B; То счас я пишу: if (isNewstr) { str_new my = ...; string res = my.A + my.B; } else { str my = ...; string res = my.A + my.B; } А может макрос какой для препроцессора, который повторяет код дважды, но для разных условий MACRO_STRU(isNewstr) TRUE: str_new my = ...; FALSE: str my = ..."; GENERAL: string res = my.A + my.B; |
|||
150
Serginio1
08.01.21
✎
17:44
|
(132) Как таковых макросов в нет. Но можно использовать динамическую компиляцию
http://rsdn.org/forum/src/3165397 |
|||
151
Ненавижу 1С
гуру
08.01.21
✎
17:47
|
(149) это называется интерфейсы
|
|||
152
Serginio1
08.01.21
✎
17:48
|
(148) Мне 57. И я только рад, что язык развивается и применяю новшества.
Я не понимаю, как молодежь может противиться нововведениям. С++ это тоже тренировка для ума. Гений уже потренировался. |
|||
153
Кирпич
08.01.21
✎
18:28
|
(152) Да никто не противится. Только мне кажется, что основная функция этих нововведений - показывать насколько C# круче Java. В остальном без них легко можно обойтись. Можно конечно всем этим виртуозно владеть и писать 10000 строк в день. Только никто столько не пишет. А GUI кроссплатформенного для C# почему то так и нету. А мне бы пригодилось.
|
|||
154
Кирпич
08.01.21
✎
18:31
|
(152) "Гений уже потренировался." Да там не в коня корм. Он вроде даже учился на программиста, а толку.
|
|||
155
Ненавижу 1С
гуру
08.01.21
✎
18:38
|
(153) можно и на си писать и даже ассемблере. Дело в удобстве. Хотя уровень абстракций всё выше, что не полезно для собственно вычислений
|
|||
156
H A D G E H O G s
08.01.21
✎
18:44
|
Я, как немного разбирающийся в Дельфи, смотрю на всю эту кроссплатформенную лабудень на C# с ужасом и благодарю ИТ богов, что мне попался одногруппник, который шарил в Дельфи, а не C.
|
|||
157
H A D G E H O G s
08.01.21
✎
18:47
|
Все эти абстракции, маршалинги и фабрики классов в Дельфи делаются незаметно, платформно, ты и даже не узнаешь об этом. Нет, ради интереса, ты можешь собрать dll с отладочными dcu и посмотреть, че там внутрях происходит, но это тебе и нахрен не нужно в 90% случаев.
|
|||
158
H A D G E H O G s
08.01.21
✎
18:50
|
Технология COM стройна, логична и проста, в ее базисе с десяток API функций. Это просто C# все извратили своими надстройками.
|
|||
159
Serginio1
08.01.21
✎
18:52
|
(153) Ну нормального кроссплатформенного гуя там и не будет. Не особо то интересно MS десктоп конкурента себе плодить.
.Net круче не только Java но и C++. Все последние нововведения больше за быстродействие. А так Xamarin.Forms и вэб морда на том же Blazor webassembly вполне себе приемлемо (156) Поверь .Net Core продвигается прежде всего за счет облаков. У Delphi очень узкая степень применения. Я уже лет 10 не писал на Delphi. И не нужно. (157) COM и натив для .Net прежде всего расширение. В реалиях маршалингом и прочей лабудой занимаются очень редко. Но и особого ужаса я не вижу. Все очень прозрачно. (158) Можешь показать извращения? |
|||
160
Serginio1
08.01.21
✎
18:55
|
[ComVisible(true)]
[ProgId("NetObjectToIDispatch45")] [ClassInterface(ClassInterfaceType.AutoDispatch)] [Guid("DFDADA57-B22C-4276-928A-8B91C9891FF1")] public class NetObjectToIDispatch45 { static NetObjectToIDispatch45() { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); } public void ЗакрытьРесурс(Object Oбъект) { object объект = AutoWrap.ПолучитьРеальныйОбъект(Oбъект); IDisposable d = объект as IDisposable; if (d != null) d.Dispose(); } public object СоздатьДелегат(object ТипДелегата, object МетодИнфо,Object Oбъект, params object[] argOrig) { //var SB = new StringBuilder(); //Delegate делегат = new Func<int,int,string>(SB.ToString); //SB.Append("Привет"); //object obj = делегат.DynamicInvoke(0,1); object объект = AutoWrap.ПолучитьРеальныйОбъект(Oбъект); MethodInfo методИнфо=(MethodInfo)AutoWrap.ПолучитьРеальныйОбъект(МетодИнфо); Type genType = (Type)AutoWrap.ПолучитьРеальныйОбъект(ТипДелегата); var типы = AutoWrap.ПолучитьМассивРеальныхОбъектов(argOrig).Cast<Type>().ToArray(); Type constructed = genType.MakeGenericType(типы); var res = Delegate.CreateDelegate(constructed, объект, методИнфо); return new AutoWrap(res); } public object ПолучитьТипизированныйПеречислитель(object Счетчик, object тип) { var cur = (IEnumerable)AutoWrap.ПолучитьРеальныйОбъект(Счетчик); Type type = (Type)AutoWrap.ПолучитьРеальныйОбъект(тип); var res= new ТипизированныйЭнумератор(cur.GetEnumerator(), type); return new MyEnumerableClass(res); } |
|||
161
Serginio1
08.01.21
✎
19:01
|
Все методы видны из 1С. И возвращаемый objесt виден на стороне 1С как variant и в данном случае как IDispatch
Все очень просто и прозрачно. Я тебе советую всетаки потратить немного времени на C#. Хуже точно не будет. Тренировка для ума и расширение возможностей. Я сейчас программирую только на C# и доволен как слон. Множество идей реализуются быстро и приятно. |
|||
162
Кирпич
08.01.21
✎
19:05
|
(159) По мне так C# вполне хорош. Была бы там нормальная компиляция в натив (как в golang, например), цены бы ему не было. А так на всю красоту куча гемора с маршалингом и хеловорд в 50 мегов. Я понимаю там порталы корпаративного масштаба писать. Это да. А одинеснику C# некуда приткнуть. ВК писать геморно. На Delphi/Lazarus проще. Какую нибудь утилиту для планктона настрочить побыстрому - питон удобнее будет.
|
|||
163
H A D G E H O G s
08.01.21
✎
19:10
|
(159) см (129). Что это? Зачем это?
Зачем какие то object, imalloc? Почему мне в Дельфи достаточно знать CoCreateInstance() и связанные с ней в худшем случае, а в лучшем я пишу CreateOleObject() для IDispatch и сплю спокойно. Это для клиента. На сервере мне просто за 5 минут нужно придумать имя класса и описать процедуры. И для работы с памятью мне достаточно знать (в худшем случае) SysAllocString(), а в лучшем Дельфи сделает это за меня при прозрачной работе с BSTR/WideString. Аналогично с ComSafeArray |
|||
164
Гений 1С
гуру
08.01.21
✎
19:30
|
(161) а ты умеешь на C# программировать формы? Там всё те же извращения с наследованиями, которые преследуют отрасль IT с 2000? На Vb6 этого гуана не было.
|
|||
165
Гений 1С
гуру
08.01.21
✎
19:31
|
(163) в C# тоже просто, как я смотрю. COMSAFEARRAY уже получилось погонять в 1С.
|
|||
166
Serginio1
08.01.21
✎
19:33
|
(163) Какие imalloc?
В Net тоже самое. object он же и Variant. Да и object в большинстве случаев ка Idispatch выступает и работается м ним через dynamic как в Delphi. Все тоже самое. В .Net тоже самое. Мало того в .Net через IReflect я любой .Net класс могу обернуть через IDIspatch. В .Net Reflection значительно мощнее. Если бы 1С внедрила бы NetObjectToIDispatch45 http://catalog.mista.ru/1c/articles/448668/ То все бы пользовались классами .Net без проблем. Ну ка на Delphi сделай? |
|||
167
Злопчинский
08.01.21
✎
19:35
|
Я что-то потерялся. а ВК что такого волшебного будет делать?
|
|||
168
Serginio1
08.01.21
✎
19:36
|
(163) Есть Windows.Forms есть WPF, UWP есть Xamarin.Forms
Нет проблем. Ест привязка данных, выравнивания и прочаая лабуда. Есть редакторы форм сериализующихся либо в код либо в Xaml и код. Как раз с формами проблем то особо то и нет для Windows и мобильных устройств. |
|||
169
Ненавижу 1С
гуру
08.01.21
✎
19:37
|
(164) какую отрасль? Ты получил какой-то неудачный урок в подвале (пардон) в неудачном ide джавы. А теперь проецируешь это на всё подряд. Ну просто создай приложение с несколькими кнопками и посмотри
|
|||
170
Serginio1
08.01.21
✎
19:38
|
||||
171
Кирпич
08.01.21
✎
19:40
|
(167) "а ВК что такого волшебного будет делать?"
Эта ВК Подтягивает гения по информатике до уровня 10 класса средней школы. |
|||
172
Гений 1С
гуру
08.01.21
✎
19:42
|
(169) не отрицай реальность
|
|||
173
Ненавижу 1С
гуру
08.01.21
✎
19:43
|
(172) 0 бит
|
|||
174
Гений 1С
гуру
08.01.21
✎
19:48
|
(171) не ври, я преподавал 9-классникам в школе
|
|||
175
Serginio1
08.01.21
✎
19:53
|
170+Ну и советую окунуться в волшебный мир Блазора
https://docs.microsoft.com/ru-ru/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-5.0 https://visualstudiomagazine.com/articles/2021/01/06/blazor-lists.aspx |
|||
176
Serginio1
08.01.21
✎
19:55
|
Ну и на русском
https://habr.com/ru/post/468019/ |
|||
177
Кирпич
08.01.21
✎
20:01
|
(175) Да у меня тоже интернет есть. Я в курсе всей этой херни.
|
|||
178
Кирпич
08.01.21
✎
20:04
|
(174) Понятно. Теперь на нашем нольбите педагогический талант полируешь.
|
|||
179
ДедМорроз
08.01.21
✎
20:14
|
Когда не важно как выделяется память,и не требуется быстрой передачи данных между потоками,то вообще не важно,на чем писать,у любого языка все отрабатывает правильно.
А когда упирается,то выясняется,что чем больше наворочено,тем сложнее это все обойти. |
|||
180
H A D G E H O G s
08.01.21
✎
20:17
|
(159) см (160) Вот это что за портянка бабуйни?
Я просто оставлю это здесь http://prntscr.com/wj5z44 |
|||
181
H A D G E H O G s
08.01.21
✎
20:18
|
Я это сделал за 15 минут. 10 минут мне понадобилось, чтобы все вспомнить.
Я написал 3 строчки тупокода. |
|||
182
H A D G E H O G s
08.01.21
✎
20:21
|
Ссылка на проект
https://yadi.sk/d/B2h_GQ-MUKjY6A Ничего ставить не надо, никуда думать не надо. 10 файлов, 9 Кб. |
|||
183
H A D G E H O G s
08.01.21
✎
20:22
|
Вы не в ту строну воюете, Сишные хлопцы.
|
|||
184
Кирпич
08.01.21
✎
20:32
|
(181) Ну так любой дурак может. Ты сделай с маршалингом, linq, лямдами, замыканиями и рантаймом в 200 мб.
|
|||
185
Гений 1С
гуру
08.01.21
✎
20:33
|
(182) так в Шарпе тоже просто.
|
|||
186
H A D G E H O G s
08.01.21
✎
20:33
|
А можно вообще вот так
http://prntscr.com/wj6azm |
|||
187
Гений 1С
гуру
08.01.21
✎
20:33
|
(186) В Шарпах вообще массив object преобразуется автоматом в COMSAFEARRAY, мне и думать не надо.
|
|||
188
Serginio1
08.01.21
✎
20:36
|
(149) Проще сделать 2 класса полями которых будут
твои структуры CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID, CCHEX_RET_RECORD_INFO_STRU Назови поля одинаково и реализуй интерфейс доступа к полям этих структур. Там просто скопировать из одного в другой. Кстати есть Generic функции Marshal.PtrToStructure<AnvizNew.CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID>(pBuff,record_info); Marshal.PtrToStructure<AnvizNew.CCHEX_RET_RECORD_INFO_STRU>(pBuff, record_info); если CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID это класс а не структура. Можешь в нем реализовать интерфейс |
|||
189
Serginio1
08.01.21
✎
20:37
|
(184) Ты отстал от жизни. Сейчас .Net 5 очень экономный. Ты живешь еще в старом мире.
При этом огромные объемы 1С тебя не сколько не смущают |
|||
190
H A D G E H O G s
08.01.21
✎
20:38
|
Надеюсь, хоть так в C# хоть можно?
http://prntscr.com/wj6f6g |
|||
191
Кирпич
08.01.21
✎
20:39
|
(189) Ну да. 30 мб рантайм. Прям как Qt
|
|||
192
Serginio1
08.01.21
✎
20:41
|
(186)
На C# public void Test2(dynamic data) { MessageBox.Show(data.НавигационнаяСсылка); } |
|||
193
H A D G E H O G s
08.01.21
✎
20:41
|
CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID
В этом имени от китайцев прекрасно всё. |
|||
194
Serginio1
08.01.21
✎
20:44
|
(191) МОТО в блазоре вообще сотня килобайт, а блазор с данными порядка 10 мб.
Ты же должен был это все прочесть! Суть в том, что для облаков нужно платить за ресурсы и чем их тратится меньше тем лучше. Поэтому то Core и развивается в сторону ресурсосбережения. П |
|||
195
Serginio1
08.01.21
✎
20:48
|
194 + https://github.com/dotnet/blazor/wiki/FAQ
Q: Wouldn't the app download size be huge if it also includes a .NET runtime? Not necessarily. .NET runtimes come in all shapes in sizes. Early Blazor prototypes used a compact .NET runtime (including assembly execution, garbage collection, threading) that compiled to a mere 60KB of WebAssembly. Blazor now runs on Mono, which is currently significantly larger, but opportunities for size optimization abound, including merging and trimming the runtime and application binaries. Other potential download size mitigations include caching and using a CDN. |
|||
196
Serginio1
08.01.21
✎
20:49
|
195+ Сборки с отложенной загрузкой в ASP.NET Core Blazor WebAssembly
https://docs.microsoft.com/ru-ru/aspnet/core/blazor/webassembly-lazy-load-assemblies?view=aspnetcore-5.0 |
|||
197
Кирпич
08.01.21
✎
20:53
|
(194) На кой мне блазор с облаками. Я буду ждать компилятора C# в нативный код. Чтобы как Go.
|
|||
198
Кирпич
08.01.21
✎
20:54
|
Вот пускай сделают блазор для десктопа. Без браузеров.
|
|||
199
Гений 1С
гуру
08.01.21
✎
21:08
|
(188) слушай, у меня бюджет не резиновый, там они только раз применяются. Поэтому ладно, оставлю If, что уж.
|
|||
200
Serginio1
08.01.21
✎
21:52
|
(197) А он давно уже есть! .Net Native называется.
Плюс развивается CoreRT https://github.com/dotnet/runtimelab Что касается блазора для десктопа то он есть, правда через WebWindow https://gunnarpeipman.com/blazor-on-desktop-webwindow-experiment/ https://blog.stevensanderson.com/2019/11/01/exploring-lighter-alternatives-to-electron-for-hosting-a-blazor-desktop-app/ (199) А причем бюджет? там как раз меньше чем if кода. Но главное нАчать! |
|||
201
Кирпич
08.01.21
✎
22:04
|
(200) Это фигня. Я сейчас нашлепал всяких настроек в проект. Хелловорд в 13 мб получился. Вполне прилично по нашим временам. Экзешник в 6 мб и 4 dll столько же. Так что переходим на C#
|
|||
202
Кирпич
08.01.21
✎
22:07
|
правда микрософт предупреждает что может и глюкануть
|
|||
203
Кирпич
08.01.21
✎
22:08
|
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <RootNamespace>_12</RootNamespace> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <PublishReadyToRun>true</PublishReadyToRun> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> <TrimMode>link</TrimMode> </PropertyGroup> </Project> |
|||
204
Гений 1С
гуру
08.01.21
✎
22:12
|
(200) да ну его в пень, скопипащу
|
|||
205
Serginio1
08.01.21
✎
22:28
|
(203) Ну да автономное обрезанное приложение https://docs.microsoft.com/ru-ru/dotnet/core/deploying/trim-self-contained
Сам еще не пробовал. Но для доккеров очень удобно. Рад, что ты все таки решился! (204) Правильно самый простой и надежный путь! |
|||
206
Serginio1
08.01.21
✎
22:31
|
(202) Если у тебя нет Reflection то проблем не будет. Та же проблема и для .Net Native
Но можно указать сборки которые не стоит обрезать из за отображения |
|||
207
Ненавижу 1С
гуру
08.01.21
✎
22:46
|
(204) никто не сомневался в твоём выборе
|
|||
208
Гений 1С
гуру
13.01.21
✎
07:04
|
Решил на досуге разобраться с 32/64.
Есть вариант сделать два проекта AnvizCCH32 и AnvizCCH64, отличающиеся только классом, описывающим DLL - линкующимся файлом "tc-b_new_sdk32.dll" и "tc-b_new_sdk64.dll" соответственно Потому что попробовал так: public AnvizCCH() { [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool SetDllDirectory(string path); var basePath = Environment.CurrentDirectory; //AppDomain.Current.BaseDirectory; if (IntPtr.Size != 4) //if (Environment.Is64BitProcess) SetDllDirectory(Path.Combine(basePath, "x64")); else SetDllDirectory(Path.Combine(basePath, "x86")); Пишет ошибку: Ошибка CS8370 Компонент "статические локальные функции" недоступен в C# 7.3. Используйте версию языка 8.0 или выше. ЧЯДНТ? |
|||
209
Гений 1С
гуру
13.01.21
✎
07:24
|
Хотя нет, вроде вышло:
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] static extern bool SetDllDirectory(string path); public AnvizCCH() { string basePath = Environment.CurrentDirectory;//AppDomain.Current.BaseDirectory; if (IntPtr.Size != 4) //if (Environment.Is64BitProcess) SetDllDirectory(Path.Combine(basePath, "x64")); else SetDllDirectory(Path.Combine(basePath, "x32")); Надо потестить, работает или нет на другом компе. |
|||
210
Гений 1С
гуру
13.01.21
✎
07:45
|
гм, проверил, работает.
Реально, если убрать каталог x64, то выдает ошибку, что не видит DLL, круто, че, спасибо Сергиньо |
|||
211
Serginio1
13.01.21
✎
10:39
|
Тебе проще использовать LoadLibrary.
Для исключения сайд эффектов static class MyDll { static AnvizCCH() { var myPath = new Uri(typeof(AnvizCCH).Assembly.CodeBase).LocalPath; var myFolder = Path.GetDirectoryName(myPath); var is64 = IntPtr.Size == 8; var subfolder = is64 ? "x64" : "x32"; LoadLibrary(Path.Combine(myFolder,subfolder ,"tc-b_new_sdk.dll"); } [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string dllToLoad); } |
|||
212
Гений 1С
гуру
13.01.21
✎
12:36
|
Получилось написать с разными типами параметров:
public object SetParam(string param, object value = null) { object prev; prev = value; //Type currType = value.GetType(); //AddLog("Param type: " + currType); if (value!= null) switch (param) { case "GetUsersCount": _GetUsersCount = Convert.ToInt64(value); AddLog("Set param to: " + _GetUsersCount); break; case "UseLongName": _UseLongName = Convert.ToBoolean(value);; AddLog("Set param to: " + _UseLongName); break; } return prev; } Вот как вызываю из 1С: Компонента.SetParam("GetUsersCount", 1); Компонента.SetParam("UseLongName", true); Компонента.SetParam("UseLongName"); |
|||
213
Гений 1С
гуру
13.01.21
✎
13:06
|
(211) спасибо, так и сделал, а что такое "сайд эффекты"?
|
|||
214
Serginio1
13.01.21
✎
15:11
|
Ну у тебя может не только эта библиотека в 1С загружаться но и другие.
"Функция SetDllDirectory добавляет каталог к пути поиска, используемому, чтобы определить местонахождение DLL для прикладной программы." И другие сборки могут и там искать |
|||
215
Serginio1
13.01.21
✎
19:18
|
А зачем такие сложности?
Сделай свойства GetUsersCount, UseLongName,UseLongName public int GetUsersCount{ get{ return _GetUsersCount; } set{ _GetUsersCount = value; AddLog("Set param to: " + _GetUsersCount); } } |
|||
216
Гений 1С
гуру
13.01.21
✎
19:27
|
(215) задача - совместимость с прошлыми версиями.
а в прошлой версии VB мне было западло на каждое свойство писать отдельный метод ВК 1С, там в трех местах прописывать надо было. |
|||
217
Гений 1С
гуру
16.01.21
✎
17:36
|
компонента близится к завершению. Остается доделать чтение отпечатков пальцев и по мелочам.
забавные фичи: 1. Я использовал в компоненте один метод из библиотеки Сканера UBIO, чтобы конвертить одинарные отпечатки в двойные. Счас пытаюсь отговорить заказчика этот метод поддерживать, иначе придется еще и SDK UBIO втаскивать, ну или писать конвертор на C#, но там структура не понятна. 2. Почему то без точки останова на этой строке в VC компонента не стартует, а из 1С стартует: anviz_handle = AnvizNew.CChex_Start(); 3. Вот какой забавный код по конвертации Int 32[] в byte[] (конвертирую массив отпечатков): FP2 = convert_objectint32array_to_byte_array(user[7]); private byte[] convert_objectint32array_to_byte_array(object _objs) { Int32[] ints = (Int32[]) _objs; byte[] bytes = new byte[ints.Length]; for (int i = 0; i < bytes.Length; i++) bytes[i] = (byte)ints[i]; return bytes; } 4. Я как считывал на бейсике персоны? Сначала считываю очередную персону и тут же считываю ее отпечатки. В аснихроне так не прокатило. Потому что как только я сделал запрос на персоны, в очереди 20 событий (на 20 персон ответ). А я тут делаю после чтения 1 события запрос на отпечатки и оно помещается в конец очереди. Приходится сначала считать персоны, а потом по каждой считывать отпечатки. Сперва не мог понять, что не так. |
|||
218
Ненавижу 1С
гуру
16.01.21
✎
18:10
|
(217) п.3: познай силу LINQ падаван )))
static private byte[] int32array_to_bytearray(object obj) => ((int[])obj).Select(i => (byte)i).ToArray(); |
|||
219
Serginio1
16.01.21
✎
18:19
|
(217) покажи свой код с async.
Используй Wait или Result. Либо запихивай в очередь и обрашивай с переодичностью, раз от ВК отказался. Или попробуй мой вариант .NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия http://catalog.mista.ru/1c/articles/417830/ |
|||
220
Serginio1
16.01.21
✎
18:20
|
Но на сервере тебе нет событий. Только опрос.
https://docs.microsoft.com/ru-ru/dotnet/api/system.collections.concurrent.concurrentqueue-1?view=net-5.0 |
|||
221
Гений 1С
гуру
16.01.21
✎
18:21
|
Кстати, забавно, в прошлых версиях SDK личности назывались Person (что более правильно), а сейчас Employee.
И забавные опечатки в названиях методов, не Convert, а Converr. Гыгыгы |
|||
222
Гений 1С
гуру
16.01.21
✎
18:21
|
(218) у меня так в VC не сработало. Я пробовал
|
|||
223
Гений 1С
гуру
16.01.21
✎
18:23
|
(219) у меня нет Asynk, я тупо опрашиваю очередь на ожидаемое событие. Ну вот например WaitUpdate тупо ждет по таймауту нужное событие:
ret = AnvizNew.CCHex_ClientConnect(Handle(), System.Text.Encoding.Default.GetBytes(IP), port); AddLog("Result of Connect: " + ret); if (ret != 1) return false; //clear chain if (!WaitUpdate((int)AnvizNew.MsgType.CCHEX_RET_DEV_LOGIN_TYPE)) return false; AnvizNew.CCHEX_RET_DEV_LOGIN_STRU dev_info; dev_info = (AnvizNew.CCHEX_RET_DEV_LOGIN_STRU)Marshal.PtrToStructure(pBuff, typeof(AnvizNew.CCHEX_RET_DEV_LOGIN_STRU)); log = log + "Dev Login --- MachineId:" + dev_info.MachineId + "\r\n" + " DevIdx:" + dev_info.DevIdx.ToString() + "\r\n" + " Version:" + byte_to_string(dev_info.Version) + "\r\n" + " DevType:" + byte_to_string(dev_info.DevType) + "\r\n" + " Addr:" + byte_to_string(dev_info.Addr) + "\r\n" + " Dev Type Flag:" + Convert.ToString(dev_info.DevTypeFlag, 16) + "\r\n"; dev_id = dev_info.DevIdx; //remember dev_id dev_type_flag = dev_info.DevTypeFlag; |
|||
224
Ненавижу 1С
гуру
16.01.21
✎
18:23
|
(222) потому что это надо уметь:
using System.Linq; |
|||
225
Гений 1С
гуру
16.01.21
✎
18:23
|
Кстати, как вам константа для тестов?
byte[] fingerprint = new byte[] { 192,2,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,192,192,8,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,192 }; |
|||
226
Гений 1С
гуру
16.01.21
✎
18:24
|
(224) все так просто? ;-) По моему у меня Linq не подключается, но буду иметь ввиду
|
|||
227
Ненавижу 1С
гуру
16.01.21
✎
18:25
|
(225) null, null, null - где-то такое уже было...
|
|||
228
Гений 1С
гуру
16.01.21
✎
18:29
|
(227) я знал, что ты вспомнишь.
|
|||
229
Ненавижу 1С
гуру
16.01.21
✎
19:17
|
(226) нет, если все так просто - то это значит, что ты не пробовал через LINQ - не надо врать
|
|||
230
Гений 1С
гуру
16.01.21
✎
19:37
|
(229) я надыбал пример с селектом в интернетах, но он не взлетел, т.к. не находил метод Select у массива.
|
|||
231
Ненавижу 1С
гуру
16.01.21
✎
19:40
|
(230) понятно как ты теперь "умеешь программировать" на C#
ты всегда так тыкаешь все подряд не осознавая что к чему? |
|||
232
Гений 1С
гуру
16.01.21
✎
19:43
|
(231) не знаю, всегда или нет. Но целей своих я добиваюсь.
|
|||
233
Гений 1С
гуру
16.01.21
✎
19:57
|
Кстати, компоненту написал в черновом варианте. Там еще подполировать кой-чего надо будет.
Пойду посчитаю время, затраченное на нее. Чую овербюджет. В Пн буду заказчику сдавать, думается. |
|||
234
Волшебник
17.01.21
✎
10:39
|
(233) Решил вопрос с имущественными правами? Кому будет принадлежать компонента?
|
|||
235
Гений 1С
гуру
17.01.21
✎
10:45
|
(234) волшебник, а проблемы метеоритной угрозы меня тоже должны волновать? ггг... с правами вроде там не возникало споров.
|
|||
236
Кирпич
17.01.21
✎
10:46
|
(233) Бери денег больше. Компенсировать месяц позора на мисте и унизительное чтение документации.
|
|||
237
Гений 1С
гуру
17.01.21
✎
10:49
|
(236) я думаю, я ее еще несколько раз продам, не дорого, правда, но норм. Ради одной оказии писать бы не стал.
|
|||
238
Ненавижу 1С
гуру
17.01.21
✎
11:02
|
В итоге одна компонента или две под 32 и 64?
|
|||
239
Гений 1С
гуру
17.01.21
✎
11:09
|
(238) ты плохо следил за веткой. Одна ВК, она динамически при старте подгружает DLL из двух разных папок.
|
|||
240
Ненавижу 1С
гуру
17.01.21
✎
11:12
|
(239) так себе сериал чтобы все подряд смотреть
|
|||
241
Гений 1С
гуру
18.01.21
✎
12:42
|
Подскажите, а на C# есть готовая библиотека для криптографии опен-key.
ну есть открытый ключ, закрытый ключ и нужно проверить их соответствие. в прошлой компоненте я это на VBasic писал |
|||
242
Serginio1
18.01.21
✎
13:18
|
||||
243
Serginio1
18.01.21
✎
13:23
|
||||
244
Serginio1
18.01.21
✎
13:34
|
||||
245
Serginio1
18.01.21
✎
13:39
|
||||
246
Гений 1С
гуру
18.01.21
✎
13:46
|
(242) эта ссылка не та, через COM-объект, остальные уже получше, хорошо
|
|||
247
Serginio1
18.01.21
✎
14:21
|
(246) Суть не про Com объект, а про проверку сертификата.
Проверить соответствие открытого и закрытого ключа можно только закодировав массив байтов и разкодировать и сравнить. В 245 старый пример. Смотри https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.cspparameters?view=net-5.0 https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.exportcspblob?view=net-5.0 или https://docs.microsoft.com/ru-ru/dotnet/api/system.security.cryptography.rsacryptoserviceprovider.exportparameters?view=net-5.0 |
|||
248
Serginio1
18.01.21
✎
14:29
|
Если у тебя ключи сохранены в Xml
https://gist.github.com/Jargon64/5b172c452827e15b21882f1d76a94be4/ |
|||
249
Гений 1С
гуру
21.01.21
✎
09:34
|
Возник вопрос - как полностью уничтожить COM-объект, так, как это происходит при перезапуске 1С.
Может у COM есть какой-то метод. COM = 0 не прокатывает, он все равно висит в памяти. |
|||
250
Кирпич
21.01.21
✎
09:50
|
(249) Зато в С# есть linq
|
|||
251
Ненавижу 1С
гуру
21.01.21
✎
10:50
|
(249) на стороне 1С, на стороне dll?
|
|||
252
Serginio1
21.01.21
✎
12:34
|
(249) Нетовские Com dll не выгружаются из памяти. То есть если у тебя есть статические переменные на которых есть ссылка на объект то они будут висеть в памяти.
Делай IDisposable https://docs.microsoft.com/ru-ru/dotnet/standard/garbage-collection/implementing-dispose И очищай ссылки в статичеких переменных в Dispose. Заодно можешь посмотреть когда срабатывает |
|||
253
Serginio1
21.01.21
✎
14:13
|
252 Да и висеть он может долго, пока сборка мусора не выполнится.
Ну и Кроме IDisposable и финализатора позоботься о закрытии портов сам в коде напрямую, а не надеяться на финализатор https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/destructors |
|||
254
Гений 1С
гуру
21.01.21
✎
20:31
|
Что-то деструктор COM-Объекта не срабатывает автоматом при обнулении COM-Объекта.
Соответственно, не могу явно вызывать Stop, приходится это из 1С вызывать. А если без Stop повторно создать AddIn.AnvizCCH, то не стартует CCH_Start, потому что она еще висит в памяти. Это как-то лечится? Пока советую создавать "AddIn.AnvizCCH" только раз и хранить на клиенте в гл.модуле. Приходится писать код с явным вызовом Stop: КомКомпонента = Новый COMОбъект("AddIn.AnvizCCH"); Порт = "1.1.4.6"; id = 0; //согласно описанию он не используется, всегда равен нулю ПортАдреса = 5010; КомКомпонента.Debug(истина); Для й = 1 По 2 Цикл Сообщить("=== Прогон: " + й); Результат = КомКомпонента.ConnectNet(Порт, id, ПортАдреса); Сообщить(" Результат подключения: " + Результат); Если Результат Тогда Результат = КомКомпонента.GetDeviceClock(); Сообщить(" Время: " + Результат); Результат = КомКомпонента.Close(id); Сообщить(" Результат закрытия: " + Результат); КонецЕсли; КонецЦикла; КомКомпонента.Stop(); Сообщить(КомКомпонента.Debug()); |
|||
255
Serginio1
21.01.21
✎
20:39
|
(256) Ну он не сработает пока сборка мусора не вызовется. Сделай еще ком объект который и будет вызывать сборку мусора.
Почитай мои статьи. GC.Collect(); // Waiting till finilizer thread will call all finalizers GC.WaitForPendingFinalizers(); |
|||
256
Гений 1С
гуру
21.01.21
✎
20:43
|
(255) Пробую, но как-то сложно дается тема реализации интерфейсов в своем классе.
|
|||
257
Serginio1
21.01.21
✎
20:53
|
(256) Но в любом случае лучше самому вызывать закрытие ресурсов перед обнулением ссылки на Com объект.
GC.Collect(); GC.WaitForPendingFinalizers(); это подчистка твоих огрехов. Интерфейсы это просто. По сути пишешь те же методы и свойства только публичные и с реализацией. Ничего сложного нет. Просто финализаторы вызываются после сборки мусора,а IDisposable можешь вызвать хоть откуда. Но при финализации нужно учесть, что объект уже закрыт, поэтому при закрытии нужно еще убрать объект из очереди финализаторов и для объекта вызвать GC.SuppressFinalize(Object) https://docs.microsoft.com/ru-RU/dotnet/api/system.gc.suppressfinalize?view=net-5.0 Есть куча паттернов |
|||
258
Гений 1С
гуру
08.02.21
✎
12:31
|
Остался один вопрос - раньше я возвращал двумерный массив, сейчас так не получается, возвращаю массив массивов.
Т.е. код пришлось заменить на такой: //Результат = РезультатМассив.GetValue(0,0); Результат = РезультатМассив.GetValue(0).GetValue(0); Я пробовал делать двумерный массив на c#, прототип функции например такой: public object[][] GetAllMessageHead(int id = 0) Но тогда когда я вызываю метод GetAllMessageHead, он пишет, что такой метод не найден, видимо не может его портировать на COM. А вот как сейчас работает: public object[] GetAllMessageHead(int id = 0) Поэтому сдаю клиенту с комментарием, что двумерные массивы надо переписать на массив массивов, но сам вопрос остается любопытным. |
|||
259
H A D G E H O G s
08.02.21
✎
12:53
|
||||
260
Кирпич
08.02.21
✎
12:54
|
мож так? object[,]
|
|||
261
Кирпич
08.02.21
✎
12:59
|
(258) перечисли кому нибудь тыщу рублей, чтобы показал тебе google или yandex
|
|||
262
H A D G E H O G s
08.02.21
✎
13:17
|
||||
263
Serginio1
08.02.21
✎
13:22
|
Ну типы ComSafeArray они прописаны
Тип элемента задается строкой и может принимать одно из следующих значений: VT_I1 - знаковое целое 1 байт; VT_I2 - знаковое целое 2 байта; VT_I4 - знаковое целое 4 байта; VT_I8 - знаковое целое 8 байт; VT_INT - знаковое целое; VT_UI1 - беззнаковое целое 1 байт; VT_UI2 - беззнаковое целое 2 байта; VT_UI4 - беззнаковое целое 4 байта; VT_UI8 - беззнаковое целое 8 байт; VT_UINT - беззнаковое целое; VT_R4 - действительное число 4 байта; VT_R8 - действительное число 8 байт; VT_DECIMAL - десятичное число с фиксированной точкой 12 байт; VT_CY - значение денежного типа; VT_DATE - значение типа дата; VT_BSTR - значение типа строка; VT_DISPATCH - указатель на интерфейс IDispatch; VT_ERROR - код ошибки; VT_BOOL - значение логического типа; VT_UNKNOWN - указатель на интерфейс IUnknown; VT_VARIANT - вариантный тип. Для элементов массивов только VT_VARIANT, а значит никаких object[][] только object[] |
|||
264
Гений 1С
гуру
08.02.21
✎
14:06
|
(263) а компонента VB тогда какой тип возвращала, раз там Getvalue(0,0) работала?
|
|||
265
Кирпич
08.02.21
✎
14:16
|
(264) Ты (260) уже пробовал или решил еще пару сотен постов потупить?
|
|||
266
Serginio1
08.02.21
✎
14:28
|
(246) Ты же можешь создать двумерный SafeArray и посмотреть как он трансформируется в .Net
Скорее всего object[,] |
|||
267
Serginio1
08.02.21
✎
14:30
|
266 к 264
|
|||
268
Serginio1
08.02.21
✎
14:31
|
||||
269
Гений 1С
гуру
16.03.21
✎
09:21
|
Кстати, компоненту написал и сдал заказчику. Всем спасибо, кто помогал.
Бюджет конечно в два раза больше, чем оплатил заказчик, но это было заранее понятно, все же я собираюсь тиражировать решение. ;-) т.е. получилось по 800 в час. |
|||
270
Garykom
гуру
16.03.21
✎
09:48
|
(269) Три месяца писал ВК?
|
|||
271
Гений 1С
гуру
16.03.21
✎
10:38
|
(270) с 8 декабря 2020 по 21 февраля 2021
|
|||
272
УдавВПопугаях
16.03.21
✎
10:39
|
(270) два с половиной, ты ошибся
серьезный подход |
|||
273
Kassern
16.03.21
✎
10:39
|
(271) там наверное 100500 методов в ней)
|
|||
274
Гений 1С
гуру
16.03.21
✎
10:40
|
(273) там скорее долгий цикл отладки, ушло 46 моих часов.
|
|||
275
Garykom
гуру
16.03.21
✎
10:41
|
(272) Угу я вот всего 1 день потратил на https://github.com/Garykom/rs232
И думаю не более на задачку ТС |
|||
276
Гений 1С
гуру
16.03.21
✎
10:42
|
(275) ну я не спец в ВК, пришлось попотеть.
|
|||
277
Гений 1С
гуру
16.03.21
✎
10:42
|
(275) не более вряд ли, там методы объемные
|
|||
278
Garykom
гуру
16.03.21
✎
10:43
|
(276) Интересно есть хоть что то в чем ты спец? Актер из тебя и то не очень ))
|
|||
279
Garykom
гуру
16.03.21
✎
10:43
|
(277) Напиши аналог моей ВК и сравним
|
|||
280
Гений 1С
гуру
16.03.21
✎
10:44
|
(278) Не знаю, не думал об этом.
(279) Я работаю на возмездной основе |
|||
281
Кирпич
16.03.21
✎
10:48
|
(275) Так на паскале любой дурак за день напишет. Паскаль же отствой и экскримент мамонта. Ты на прогрессивном C# попробуй за день написать или на великом С++
|
|||
282
Гений 1С
гуру
16.03.21
✎
10:51
|
(278) думаю я по Рознице спец и во вторую очередь по УТ
|
|||
283
Garykom
гуру
16.03.21
✎
11:03
|
(281) На C# еще проще чем на паскале писать
Вот на C++ там конечно сложней ибо я не спец по нему |
|||
284
Гений 1С
гуру
16.03.21
✎
11:04
|
(283) Согласен, шарп ближе к бейсику и 1с
|
|||
285
Serginio1
17.03.21
✎
10:59
|
(284) Ну народ с тобой не согласен. Посмотри на C#9. Он могуч. Просто ты используешь его малую толику
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-9 А так да, сборка мусора, Reflection и язык достаточно дружелюбный. Говорю как бывший паскалист |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |