Имя: Пароль:
1C
 
Пишу 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
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 и язык достаточно дружелюбный. Говорю как бывший паскалист
2 + 2 = 3.9999999999999999999999999999999...