Вход | Регистрация
    1  2  3   

Пишу COM-ВК для 1C на С#

Пишу COM-ВК для 1C на С#
Я
   Гений 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: и как убрать мигающую елку справа, закрывает окно написания поста?
   Serginio1
 
101 - 08.01.21 - 12:26
   Serginio1
 
102 - 08.01.21 - 12:27
   Кирпич
 
103 - 08.01.21 - 12:27
(100) Ты лучше позаботься о том, чтобы выделенную память вернуть обратно.
   Кирпич
 
104 - 08.01.21 - 12:29
А то твоя супергениальная система проработает полчаса и сожрет всю память на компьютере
   Serginio1
 
105 - 08.01.21 - 12:53
   Гений 1С
 
106 - 08.01.21 - 13:17
(103) деструктор удаляет автоматом
   Гений 1С
 
107 - 08.01.21 - 13:28
(101) гм, спасибо, будем чистить: Marshal.FreeHGlobal
   Гений 1С
 
108 - 08.01.21 - 13:51
(105) Sukko, работает! я сделал pBuff приватной переменной класса COM-объекта и выделяю ей память лишь раз, в конструкторе.
   Гений 1С
 
109 - 08.01.21 - 13:51
Вот кстати, там есть блок функций строковых простейших.
Можно ли их запихнуть в отдельный модуль, чтобы глаз не мозолили?
Или надо оформлять класс какой-либо, просто модуль функций нельзя?
   H A D G E H O G s
 
110 - 08.01.21 - 13:54
Щас Г1С откроет для себя строковые ресурсы.
   ДедМорроз
 
111 - 08.01.21 - 13:59
А что мы хотим получить?
Зачем мы выделяем память,а не создаём объекты,которые будут управляться сборщиком мусора.
Кроме того,если мы создаём память для работы с Com,то по правильному нужно использовать интерфейс IMalloc,иначе возможны проблемы с выполнением программы,которые очень сложно отловить.

Для 1с проще при возврате в 1с возвращать не массив,а строку,из которой уже в 1с получится массив через ЗначениеИзСтрокиВнутр,по крайней мере,будет намного меньше преобразований.
   ДедМорроз
 
112 - 08.01.21 - 14:01
А чем статические члены класса отличаются от просто функций?
   Гений 1С
 
113 - 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;

Нельзя привязать к общему типу?
   Serginio1
 
114 - 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
   Гений 1С
 
115 - 08.01.21 - 14:18
(114) не, ну а просто библиотеку функций как забацать? Я не хочу чтобы функции болтались в классе, проще их в отдельный модуль закинуть. они по сути не от этого класса, там разные конвертации - байты в строки и т.п.
   Serginio1
 
116 - 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) Делай как хочешь. У тебя куча инструментов. Используй как твоему гению угодно! Это же творчество!
   Гений 1С
 
117 - 08.01.21 - 14:24
(116) да я то и делаю. ;-)
блин, кривовато, что с двумя одинакомывми классами нельзя работать по именам свойств, абыдно, Но не критично.
   Serginio1
 
118 - 08.01.21 - 14:28
(117) Ну можешь использовать привычный тебе dynamic https://metanit.com/sharp/tutorial/9.1.php
Если скорость не критична
   Serginio1
 
119 - 08.01.21 - 14:29
Но лучшая практика это интерфейсы https://metanit.com/sharp/tutorial/3.9.php
   zavsom
 
120 - 08.01.21 - 14:40
(0) Серега я в марте купил 32 биткоина и 70 эфиров сейчас я даже посчитать боюсь сколько это денег стоит
   zavsom
 
121 - 08.01.21 - 14:41
детишки программишки давайте дружненько умножим 41500 баксов на 32 = ? а 1250 $ * 70 = ? у меня ладошки потеют
   zavsom
 
122 - 08.01.21 - 14:45
правда есть один маленький ньюансик - вывести ничего нельзя :(
   УдавВПопугаях
 
123 - 08.01.21 - 14:56
(122) а что за прикол, не в теме
   Гений 1С
 
124 - 08.01.21 - 15:02
(120) харе оффтопить.

УУУУУУУУУУУУУУУУУУУУРРРРРРРРРРРРРРРАААААААААААААА!

В компоненте просто метод возвращает object[], 1С видит его как ComsafeArray, подозреваю и обратное верно.
То бишь без всяких плясок с бубнами и вариантов маршаллируется.
   ДедМорроз
 
125 - 08.01.21 - 15:14
Разбираться с преобразованиями имеет смысл,если хочется повысить производительность и избежать преобразования.
Просто, object[] у тебя будет в памяти,управляемой сборщиком мусора,а результат,передаваемый в 1с будет в памяти,управляемой через IMalloc.
   Ненавижу 1С
 
126 - 08.01.21 - 15:23
(113) не увидел объявлений типа
   Гений 1С
 
127 - 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

        }
   Гений 1С
 
128 - 08.01.21 - 16:08
(125) да ладно, нормально и так. тонкая оптимизация стоит других денег. там можно шарписта нанять, передав уже готовый код
   Serginio1
 
129 - 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С это не сделать
   Гений 1С
 
130 - 08.01.21 - 16:34
(129) ну тогда и не надо. счас еще доковыряю параметры разного типа. Попробую реализовать через объявления одинаковых процедуры но с разным типом параметров.
 
 Рекламное место пустует
   Serginio1
 
131 - 08.01.21 - 16:36
(127) Сделай их классами с [StructLayout(LayoutKind.Sequential)] и пришпандорь интерфейс.
Класс нужен, что бы не боксить структуру
https://stackoverflow.com/questions/3032750/structs-interfaces-and-boxing
   Гений 1С
 
132 - 08.01.21 - 16:56
(131) а через макросы никак? (препроцессор)?
   Кирпич
 
133 - 08.01.21 - 16:57
(128) Опытному шарписту твой готовый код нафиг не нужен. Разве что поржать. Смесь китайского копипаста и первый опыт инстаграмщицы в программировании.
.NET удивителен. Вроде всё красиво и всё есть. А как доходит дело до реальных задач так и начинается куча гемора и латки-заплатки с квадратными скобками, маршалингом-хреналингом. Вся красота исчезает напрочь.
   Гений 1С
 
134 - 08.01.21 - 16:57
(133) ну COM изначально был франкенштейном
   Кирпич
 
135 - 08.01.21 - 16:59
(134) COM в Delphi надо писать. Там красиво и быстро получается.
   Serginio1
 
136 - 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
   Garykom
 
137 - 08.01.21 - 17:13
(133) Хм как это ни странно но да крутой ООП на практике нифига не красив, сплошные костыли и куча легаси.
Постоянные переписки (заранее все сложно предусмотреть) превращают все в дикий ужас ну или постоянно рефакторить.
Банальная функциональщина часто лучще
   Гений 1С
 
138 - 08.01.21 - 17:19
(136) уже одно то, что в Дельфи поскаль с его беган-енд убивает красоту.
   Ненавижу 1С
 
139 - 08.01.21 - 17:21
(131) опасно
   Ненавижу 1С
 
140 - 08.01.21 - 17:22
(132) нет (почти) макросов в .NET
   Ненавижу 1С
 
141 - 08.01.21 - 17:24
(138) то есть в 1С КонецЕсли не убивает?
   Гений 1С
 
142 - 08.01.21 - 17:25
(141) в 1с конец если из бейсика. это несколько другое. но Си конечно, красивее бейсика и паскаля. Лаконичнее
   Кирпич
 
143 - 08.01.21 - 17:26
(138) Не об этой красоте речь
   Гений 1С
 
144 - 08.01.21 - 17:26
(133) ты в упор читать не умеешь. Отдать на рефакторинг за деньги. Было ж написано.
   Serginio1
 
145 - 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
   Ненавижу 1С
 
146 - 08.01.21 - 17:27
(142) "это другое, понимать надо" (с)
   Ненавижу 1С
 
147 - 08.01.21 - 17:29
(145) по поводу деревьев:
читал вчера https://habr.com/ru/company/jugru/blog/423891/
вроде и сделали прекрасный инструмент, но одновременно и нагородили себе чем заняться
   Кирпич
 
148 - 08.01.21 - 17:31
(145) Да микрософт и слона скоро в C# запихнет. Тебе на радость. И так уже страшнее С++
   Гений 1С
 
149 - 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;
   Serginio1
 
150 - 08.01.21 - 17:44
(132) Как таковых макросов в нет. Но можно использовать динамическую компиляцию
http://rsdn.org/forum/src/3165397
   Ненавижу 1С
 
151 - 08.01.21 - 17:47
(149) это называется интерфейсы
   Serginio1
 
152 - 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) "Гений уже потренировался." Да там не в коня корм. Он вроде даже учился на программиста, а толку.
   Ненавижу 1С
 
155 - 08.01.21 - 18:38
(153) можно и на си писать и даже ассемблере. Дело в удобстве. Хотя уровень абстракций всё выше, что не полезно для собственно вычислений
   H A D G E H O G s
 
156 - 08.01.21 - 18:44
Я, как немного разбирающийся в Дельфи, смотрю на всю эту кроссплатформенную лабудень на C# с ужасом и благодарю ИТ богов, что мне попался одногруппник, который шарил в Дельфи, а не C.
   H A D G E H O G s
 
157 - 08.01.21 - 18:47
Все эти абстракции, маршалинги и фабрики классов в Дельфи делаются незаметно, платформно, ты и даже не узнаешь об этом. Нет, ради интереса, ты можешь собрать dll с отладочными dcu и посмотреть, че там внутрях происходит, но это тебе и нахрен не нужно в 90% случаев.
   H A D G E H O G s
 
158 - 08.01.21 - 18:50
Технология COM стройна, логична и проста, в ее базисе с десяток API функций. Это просто C# все извратили своими надстройками.
   Serginio1
 
159 - 08.01.21 - 18:52
(153) Ну нормального кроссплатформенного гуя там и не будет. Не особо то интересно MS десктоп конкурента себе плодить.
.Net круче не только Java но и C++. Все последние нововведения больше за быстродействие.
А так Xamarin.Forms и вэб морда на том же Blazor webassembly вполне себе приемлемо
(156) Поверь .Net Core продвигается прежде всего за счет облаков. У Delphi очень узкая степень применения.
Я уже лет 10 не писал на Delphi. И не нужно.

(157) COM и натив для .Net прежде всего расширение. В реалиях маршалингом и прочей лабудой занимаются очень редко. Но и особого ужаса я не вижу.
Все очень прозрачно.
(158) Можешь показать извращения?
   Serginio1
 
160 - 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);
        }
 
 Рекламное место пустует
   Serginio1
 
161 - 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 проще. Какую нибудь утилиту для планктона настрочить побыстрому - питон удобнее будет.
   H A D G E H O G s
 
163 - 08.01.21 - 19:10
(159) см (129). Что это? Зачем это?

Зачем какие то object, imalloc?
Почему мне в Дельфи достаточно знать CoCreateInstance() и связанные с ней в худшем случае, а в лучшем я пишу CreateOleObject() для IDispatch и сплю спокойно. Это для клиента.

На сервере мне просто за 5 минут нужно придумать имя класса и описать процедуры. И для работы с памятью мне достаточно знать (в худшем случае) SysAllocString(), а в лучшем Дельфи сделает это за меня при прозрачной работе с BSTR/WideString. Аналогично с ComSafeArray
   Гений 1С
 
164 - 08.01.21 - 19:30
(161) а ты умеешь на C# программировать формы? Там всё те же извращения с наследованиями, которые преследуют отрасль IT с 2000? На Vb6 этого гуана не было.
   Гений 1С
 
165 - 08.01.21 - 19:31
(163) в C# тоже просто, как я смотрю. COMSAFEARRAY уже получилось погонять в 1С.
   Serginio1
 
166 - 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
Я что-то потерялся. а ВК что такого волшебного будет делать?
   Serginio1
 
168 - 08.01.21 - 19:36
(163) Есть Windows.Forms есть WPF, UWP есть Xamarin.Forms
Нет проблем. Ест привязка данных, выравнивания и прочаая лабуда. Есть редакторы форм сериализующихся либо в код либо в Xaml и код.
Как раз с формами проблем то особо то и нет для Windows и мобильных устройств.
   Ненавижу 1С
 
169 - 08.01.21 - 19:37
(164) какую отрасль? Ты получил какой-то неудачный урок в подвале (пардон) в неудачном ide джавы. А теперь проецируешь это на всё подряд. Ну просто создай приложение с несколькими кнопками и посмотри
   Serginio1
 
170 - 08.01.21 - 19:38
   Кирпич
 
171 - 08.01.21 - 19:40
(167) "а ВК что такого волшебного будет делать?"
Эта ВК Подтягивает гения по информатике до уровня 10 класса средней школы.
   Гений 1С
 
172 - 08.01.21 - 19:42
(169) не отрицай реальность
   Ненавижу 1С
 
173 - 08.01.21 - 19:43
(172) 0 бит
   Гений 1С
 
174 - 08.01.21 - 19:48
(171) не ври, я преподавал 9-классникам в школе
   Serginio1
 
175 - 08.01.21 - 19:53
   Serginio1
 
176 - 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
Когда не важно как выделяется память,и не требуется быстрой передачи данных между потоками,то вообще не важно,на чем писать,у любого языка все отрабатывает правильно.
А когда упирается,то выясняется,что чем больше наворочено,тем сложнее это все обойти.
   H A D G E H O G s
 
180 - 08.01.21 - 20:17
(159) см (160) Вот это что за портянка бабуйни?

Я просто оставлю это здесь
http://prntscr.com/wj5z44
   H A D G E H O G s
 
181 - 08.01.21 - 20:18
Я это сделал за 15 минут. 10 минут мне понадобилось, чтобы все вспомнить.
Я написал 3 строчки тупокода.
   H A D G E H O G s
 
182 - 08.01.21 - 20:21
Ссылка на проект
https://yadi.sk/d/B2h_GQ-MUKjY6A
Ничего ставить не надо, никуда думать не надо.
10 файлов, 9 Кб.
   H A D G E H O G s
 
183 - 08.01.21 - 20:22
Вы не в ту строну воюете, Сишные хлопцы.
   Кирпич
 
184 - 08.01.21 - 20:32
(181) Ну так любой дурак может. Ты сделай с маршалингом, linq, лямдами, замыканиями и рантаймом в 200 мб.
   Гений 1С
 
185 - 08.01.21 - 20:33
(182) так в Шарпе тоже просто.
   H A D G E H O G s
 
186 - 08.01.21 - 20:33
А можно вообще вот так
http://prntscr.com/wj6azm
   Гений 1С
 
187 - 08.01.21 - 20:33
(186) В Шарпах вообще массив object преобразуется автоматом в COMSAFEARRAY, мне и думать не надо.
   Serginio1
 
188 - 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 это класс а не структура. Можешь в нем реализовать интерфейс
   Serginio1
 
189 - 08.01.21 - 20:37
(184) Ты отстал от жизни. Сейчас .Net 5 очень экономный. Ты живешь еще в старом мире.
При этом огромные объемы 1С тебя не сколько не смущают
   H A D G E H O G s
 
190 - 08.01.21 - 20:38
Надеюсь, хоть так в C# хоть можно?
http://prntscr.com/wj6f6g
   Кирпич
 
191 - 08.01.21 - 20:39
(189) Ну да. 30 мб рантайм. Прям как Qt
   Serginio1
 
192 - 08.01.21 - 20:41
(186)

На C#
public void Test2(dynamic data)
{
MessageBox.Show(data.НавигационнаяСсылка);
}
   H A D G E H O G s
 
193 - 08.01.21 - 20:41
CCHEX_RET_RECORD_INFO_STRU_VER_4_NEWID

В этом имени от китайцев прекрасно всё.
   Serginio1
 
194 - 08.01.21 - 20:44
(191) МОТО в блазоре вообще сотня килобайт, а блазор  с данными порядка 10 мб.
Ты же должен был это все прочесть!

Суть в том, что для облаков нужно платить за ресурсы и чем их тратится меньше тем лучше. Поэтому то Core и развивается в сторону ресурсосбережения.
П
   Serginio1
 
195 - 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.
   Serginio1
 
196 - 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
Вот пускай сделают блазор для десктопа. Без браузеров.
   Гений 1С
 
199 - 08.01.21 - 21:08
(188) слушай, у меня бюджет не резиновый, там они только раз применяются. Поэтому ладно, оставлю If, что уж.
   Serginio1
 
200 - 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 кода.
Но главное нАчать!
  1  2  3   

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