Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / WinForms, .Net Framework |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 3 [все] |
jenya7 Member Откуда: Сообщений: 1349 |
Я создал Solution - Tests. В Solution я создал несколько ConsoleApp - Test1, Test2, Test3. И я прогоняю их один за другим Test1.exe, Test2.exe, Test3.exe. Но мне нужен общий класс с глобальными объектами которые я мог бы передавать от Test1.exe к Test2.exe. Как это сделать? Сообщение было отредактировано: 7 мар 21, 15:52 |
7 мар 21, 15:59 [22290913] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
если программы запускаются последовательно, то все объекты, которые будут созданы в Test1 будут удалены из памяти, когда она завершится и запустится Test2 То есть результаты надо сохранять в файл или перенаправить через console pipes в приложение Test2. |
7 мар 21, 16:14 [22290914] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
так это не результаты это объекты. я работаю с карточками, скажем 16 выходов (релей) подключенных по USB. производитель карточек дает dll для .Net я хочу инициализировать девайс в Test1 using IAHAL; //dll from IA IADevices iadevs = new IADevices(); IADevice REL1; IADevice REL2; void Init_3178() { IAError ec; bool rel1_ex = false; bool rel2_ex = false; ec = iadevs.DetectAllDevices(); if (ec != IAError.IA_OK) MessageBox.Show(iadevs.GetErrorMessage(ec)); if (iadevs.Devices.Count == 0) MessageBox.Show("No device found"); else { foreach (IADevice dev in iadevs) { //get the first device with DI functions if (dev.HasDigitalInput || dev.HasDigitalOutput) { // populate device rich box parent.Print_in_IADeviceListRichBox(dev.UniqueID+" Is Connected\n"); if (dev.UniqueID.Contains("01_IA_3178")) { REL1 = dev; relay_rel1 = 0; REL1.WriteDO(0); rel1_ex = true; } else if (dev.UniqueID.Contains("00_IA_3178")) { REL2 = dev; REL2.WriteDO(0); rel2_ex = true; } } } if (rel1_ex == false) { parent.Print_in_IADeviceListRichBox("IA 3178(REL1) is Missing \n"); System.Windows.MessageBox.Show("IA 3178 01 is Not Connected"); } if (rel2_ex == false) { parent.Print_in_IADeviceListRichBox("IA 3178(REL2) is Missing \n"); System.Windows.MessageBox.Show("IA 3178 00 is Not Connected"); } } } а включать-выключать реле в Test2 relay_mask |= (ulong)Math.Pow(2, relay_num - 1); iaErr = REL1.WriteDO(relay_mask ); тогда
IADevices iadevs = new IADevices();
IADevice REL1;
IADevice REL2;
должны быть глобальными для обеих. Сообщение было отредактировано: 7 мар 21, 16:28 |
||||
7 мар 21, 16:32 [22290919] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6154 |
Ну синглтон же банальный. Если религия не позволяет сделать это в классическом виде, то DI в singleton scope. |
||||
7 мар 21, 20:31 [22290961] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
это как? засунуть объекты в dll и линковать его к каждому проекту? |
||||||||
7 мар 21, 20:36 [22290963] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Ты скажи, что ты имеешь в виду под
А, впрочем, понял. Это тебе какой-нибудь IPC нужен. Сообщение было отредактировано: 7 мар 21, 20:37 |
||||||||
7 мар 21, 20:42 [22290966] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Какой, к лешему, синглетон - у него ведь все по разным процессам (как я понял). |
||||||||
7 мар 21, 20:46 [22290968] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
архитектуру нужно просто нормальную, а не это нечто идея делать 1 объект на 3 процесса, влечет за собой огромные проблемы с синхронизацией этого объекта, не между потоками, а между процессами. |
7 мар 21, 20:58 [22290970] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как сделать? Сообщение было отредактировано: 7 мар 21, 20:57 |
||||
7 мар 21, 21:04 [22290971] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
в принципе я из разных процессов обращаюсь к общим статическим объектам в рамках одного проекта. может то же самое можно делать и с несколькими проектами. |
||||||||
7 мар 21, 21:07 [22290972] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||||
7 мар 21, 21:21 [22290976] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
ну если я инициализирую объект в одном процессе
IADevices iadevs = new IADevices();
я не могу передать указатель на него в другом? можно выделить какую нибудь область shared memory? |
||||||||
7 мар 21, 22:54 [22291001] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Нет, не можешь. У каждого процесса своя память. Сериализуй свои объекты и передавай между процессами. Но для чего это тебе вообще нужно, пока неясно. |
7 мар 21, 23:42 [22291005] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Ты колдун. |
||||
7 мар 21, 23:51 [22291008] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Может просто взять БД и там хранить "статические объекты" ? Тут SQLite хватит |
8 мар 21, 07:56 [22291032] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как это можно хранить в БД? объект
IADevices iadevs = new IADevices();
это девайсы подключенные по USB. я его инициализирую. нахожу подключенные карты. iadevs.DetectAllDevices(); и потом линкую к объекту этой карты IADevice REL1; IADevice REL2; foreach (IADevice dev in iadevs) { //get the first device with DI functions if (dev.HasDigitalInput || dev.HasDigitalOutput) { // populate device rich box parent.Print_in_IADeviceListRichBox(dev.UniqueID+" Is Connected\n"); if (dev.UniqueID.Contains("01_IA_3178")) { REL1 = dev; relay_rel1 = 0; REL1.WriteDO(0); rel1_ex = true; } else if (dev.UniqueID.Contains("00_IA_3178")) { REL2 = dev; REL2.WriteDO(0); rel2_ex = true; } } } и потом я с этим REL1 хочу работать в Test2.exe. Неужели это такая сложная задача? Может вынести объекты в глобальный dll или exe где они будут сохраняться? Сообщение было отредактировано: 8 мар 21, 09:58 |
||||
8 мар 21, 10:01 [22291046] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
А почему именно так? Ведь можно было бы создать один exe, в коде которого последовательно запускать задачи (экземпляры Task). Тогда и объект, содержащий данные, можно будет последовательно передавать из задачи в задачу без использования дополнительного шага предназначенного для хранения промежуточных данных (т.е. без создания файлов, без хранения в БД, без использования брокера сообщений). |
||||
8 мар 21, 10:24 [22291053] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
это устаревший подход. не гибкий. я взял парадигму - LabView + TestStand. В LabView пишуться модули (*.vi) а TestStand их прогоняет. завтра нужно прогнать другой сиквенс - поменял, добавил, убрал несколько *.vi и всё. решил реализовать тот же принцип в .Net. скажем есть модуль управления одной картой, есть модуль управления другой картой, и так далее комбинируя модули можно создавать разные сиквенсы. в LabView + TestStand это работает просто отлично. у меня это работает в .Net. есть менеджер который прогоняет мои модули (exe файлы). но есть моменты как например тот что я описал выше- чтоб включить-выключить одно реле мне каждый раз надо производить процесс инициализации девайсов, поиска карточек а я хочу сделать один раз инициализацию и потом включать-выключать выходы и опрашивать входы. Сообщение было отредактировано: 8 мар 21, 11:07 |
||||||||
8 мар 21, 11:06 [22291076] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Это противоречит устройству ОС. Объекты хранятся не в dll или exe, а в памяти процесса. Процессы максимально изолированы друг от друга чтобы сбой в одном никак не влиял на другой. У каждого процесса свое адресное пространство, там где у одного в памяти лежит объект А, у другого это место занято объектом В. Поэтому нельзя просто так передать объект из процесса в процесс. Если интересно как оно устроено - читай Рихтера Windows via C/C++. Там есть решения, но непростые, тут в двух словах не описать. Тут как вариант можешь сделать кучу DLL, которые подгружаются в один процесс. Тогда запускающий EXE создаст твои объекты и по очереди загрузит нужные DLL вызывая тесты в них с передачей общих объектов. |
||||
8 мар 21, 11:49 [22291089] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Ну и пусть каждый модуль обращается к единому резидентному сервису, который хранит и удерживает все эти инициализированные классы. То есть непосредственным управлением внешним устройством должен заниматься выделенный (интеграционный, адаптер, драйвер) слой, все остальные (модули, плагины, компоненты) находятся на более высоком уровне абстракции и обращаются к этому сервису, а не общаются напрямую с устройством |
8 мар 21, 11:51 [22291090] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
а как реализовать практически? Сообщение было отредактировано: 8 мар 21, 12:05 |
||||
8 мар 21, 12:07 [22291098] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
у меня есть опция запустить exe не только как консоль но и визуально. некоторые тесты требуют итерации с оператором. с dll так не получится. |
||||||||
8 мар 21, 12:16 [22291100] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Как написать свой сервис (службу), легко найти в интернете, тем более, это зависит от твоей среды разработки, которую ты не озвучил. Как провести границу абстрации между этим сервисом и компонентами - это твоя задача на хорошо подумать, только ты знаком со своей предметной областью. В идеале - это универсальный интерфейс, который принимает от компонента некую команду и передает её устройству. Если устройства слишком разные, может быть получится несколько разных интерфейсов. Так или иначе, служба не выставляет наружу какие-то классы, она принимает команды в каком-то виде (к примеру json), интерпретирует и отправляет нужному устройству. |
8 мар 21, 12:17 [22291101] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
Шо значит не озвучил cреду разработки - я об ней второй день говорю - .Net - C#. подключение к USB девайсу это настройка дескрипторов и эндпоинтов. я не особо силен в теории но полагаю что эти настройки можно как то сериализовать и передать, я просто не знаю как. скажем карточки подключенные по серийному порту (UART) с ними вообще проблем нет - порт открыл, порт закрыл, прямой доступ к COM порту из любого exe. если бы все сидели на UART (как это было до сих пор) и темы бы не возникло. Сообщение было отредактировано: 8 мар 21, 12:25 |
||||
8 мар 21, 12:32 [22291103] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
А в чём "не гибкость"?. Есть exe-приложение. У него есть подкаталог Extensions, в котором складываются DLL-файлы, в которых определены реализации конкретных задач. Состав и содержимое DLL-файлов может меняться со временем, путём их обновления/удаления/добавления новых. Т.е. если потребуется добавить новые задачи, то их можно собрать в виде дополнительного DLL-файла и поместить в этот подкаталог. EXE-приложение в процессе своей работы динамически загружает все DLL-файлы из каталога Extensions и смотрит, какие задачи в них реализованы. Дополнительно, рядом с EXE-файлом, находится конфигурационный файл (XML или JSON), описывающий, какие задачи и в каком порядке следует выполнять. По мере необходимости этот конфиг-файл редактируется. Я не настаиваю - делайте так, как сами посчитаете нужным. Сообщение было отредактировано: 8 мар 21, 12:41 |
||||
8 мар 21, 12:46 [22291107] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Как минимум - .Net Framework или .Net Core |
||||
8 мар 21, 12:49 [22291108] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Строго говоря, .Net - C# -это не среда разработки. Сообщение было отредактировано: 8 мар 21, 12:48 |
||||
8 мар 21, 12:51 [22291109] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
.NET Framework 4.6.1. а что есть существенная разница? в .Net Core мои фантазии реализуются? :) |
||||||||
8 мар 21, 12:55 [22291112] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Разница есть. Не всё то, что есть в .Net Framework, реализовано в .Net Core или .Net 5. Но если вы не будете использовать такие вещи как, к примеру, WCF или WF, то для вас это может быть и не критичным. Сообщение было отредактировано: 8 мар 21, 12:53 |
||||
8 мар 21, 12:58 [22291113] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Если вообще нужна служба. Если достаточно будет обычной WF-проги (раз уж нужно взаимодействие с пользователем), которая работает только когда запущена, ну можно и без службы обойтись. |
||||
8 мар 21, 13:04 [22291116] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Почитайте про сериализацию/десериализацию объектов. Лично я предпочитаю сериализовывать/десериализовывать в формат JSON. Этот формат с некоторых пор, помимо двоичного и XML доступен к использованию "из коробки", причём пользоваться коробочной версией значительно удобней, чем старым, добрым NewtonSoft. К тому же JSON отлично, без дополнительных плясок с бубном, понимают и др. языки, такие как JavaScript/TypeScript и Java (на тот случай, если вам потребуется передать результат на сторону). |
||||
8 мар 21, 13:16 [22291121] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
тут вопрос только в том, сможет ли он десериализовать состояние класса, который завязан на состояние внешнего устройства. Так все равно может понадобиться некий централизованный сервис, который их удерживает в памяти. |
8 мар 21, 13:25 [22291127] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
https://docs.microsoft.com/ru-ru/dotnet/standard/io/memory-mapped-files |
8 мар 21, 14:06 [22291140] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
Просмотрел топик, а что про COM даже ещё никто не сказал? :) Сложно-сложно. Старая школа, создавай COM, регистрируй и общайся через него разными процессами ))) |
8 мар 21, 14:08 [22291144] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
выглядит круто. попробую. |
||||
8 мар 21, 14:12 [22291148] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Мне кажется, что это дорога в Ад. :) |
||||
8 мар 21, 14:13 [22291150] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
начнем с того что методы Write, Read не предоставляют возможности записи объекта. а как сериализовать IADevice REL1; понятия не имею. в принипе я могу открыть обычный файл и писать-читать. Сообщение было отредактировано: 8 мар 21, 14:24 |
||||||||
8 мар 21, 14:27 [22291157] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Покажите свою реализацию IADevice, а так же ваш код сериализации. |
||||
8 мар 21, 14:43 [22291166] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Никак скорее всего. Внутри них хэндлы объектов ОС, открытых COM-портов или типа того, их нельзя сериализовать. Они действительны только внутри конкретного процесса. Есть способ передать хэндл другому процессу DuplicateHandle(), но тут тебе надо в этот класс залезть, чтобы до хэндла добраться. Поэтому не будет работать как ты хочешь. |
||||
8 мар 21, 14:49 [22291172] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
using IAHAL; //dll от производителя карты - IA3178 //объекты из dll IADevices iadevs = new IADevices(); IADevice REL1; IADevice REL2; void Init_3178() { IAError ec; bool rel1_ex = false; bool rel2_ex = false; //находим все девайсы подключенные к USB ec = iadevs.DetectAllDevices(); if (ec != IAError.IA_OK) MessageBox.Show(iadevs.GetErrorMessage(ec)); if (iadevs.Devices.Count == 0) MessageBox.Show("No device found"); else { foreach (IADevice dev in iadevs) { //get the first device with DI functions if (dev.HasDigitalInput || dev.HasDigitalOutput) { if (dev.UniqueID.Contains("01_IA_3178")) { REL1 = dev; relay_rel1 = 0; REL1.WriteDO(0); rel1_ex = true; } else if (dev.UniqueID.Contains("00_IA_3178")) { REL2 = dev; REL2.WriteDO(0); rel2_ex = true; } } } } } Сообщение было отредактировано: 8 мар 21, 14:46 |
||||||||
8 мар 21, 14:52 [22291173] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
jenya7, Вы понимаете, что такое реализация интерфейса? То, что вы сейчас скопировали из своего более раннего сообщения - это вообще не то. Если вы хотите сериализовывать экземпляр класса, реализующего интерфейс IADevice, то это должен быть максимально простой класс (DTO-класс), содержащий только данные. Обычно под это дело создают классы отдельно, предназначенные именно для сериализации и десериатилазции. В них, посредством специальных атрибутов, указывают, какие поля сериализовывать, а какие нет. Там же указывают, какие поля обязательны к заполнению, а какие нет. Эти классы, как правило, не содержат логики, т.к. они не для этого предназначены. Если у вас реализация обозначенного интерфейса содержит в себе не просто свойства, но и дополнительные скрытые поля, которые нужно правильно инициализировать тем или иным способом, а так же содержит различные методы, то такой класс, скорее всего, создавался без прицела на возможность его сериализации. Тогда вам нужно написать свой простой класс, сериализующий данные. Как вариант источника информации: тема сериализации/десериализации хорошо разжёвана в главе 17 (Сериализация) книги "C# 7.0. Справочник. Полное описание языка" за авторством Албахари Бен , Албахари Джозеф. Сообщение было отредактировано: 8 мар 21, 14:59 |
8 мар 21, 15:02 [22291178] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
я могу оформить IADevice в отдельный класс но он все равно будет содержать методы и логику иначе как я потом буду управлять картой. |
||||
8 мар 21, 15:08 [22291180] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Так вам же не обязательно сериализовывать именно класс, реализующий этот интерфейс. Вы можете специально для возможности сериализации/десериализации создать отдельный простой класс, содержащий все нужные вам данные, подлежащие передачи на сторону. |
||||
8 мар 21, 15:12 [22291182] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
он должен быть статическим? |
||||||||
8 мар 21, 15:18 [22291187] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||||
8 мар 21, 15:19 [22291189] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Очевидно же, что просто подключить девайс к серверу БД. |
||||||||
8 мар 21, 15:23 [22291191] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Бинарную сериализацию из .NET Core выпилили. |
||||
8 мар 21, 15:26 [22291192] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Нет конечно. Невозможно создавать экземпляры статических классов. Мне кажется, что у вас по части ООП и .NET некоторая каша в голове. Возможно имеет смысл сначала почитать основы и попрактиковаться в создании простеньких консольных приложений аля "Hello World", прежде чем писать боевое приложение. В противном случае вы рискуете "утонуть" в своём же коде. ИМХО. Сообщение было отредактировано: 8 мар 21, 15:22 |
||||
8 мар 21, 15:26 [22291193] Ответить | Цитировать Сообщить модератору |
Compositum Member Откуда: Санкт-Петербург Сообщений: 5967 |
Не знал. :) Да и не пользовался ею давно в реальных приложениях (только в тестовых консольках, когда экспериментировал с тем, о чём читал в книжках). Даже XML уже давно перестал использовать в пользу JSON. Сообщение было отредактировано: 8 мар 21, 15:21 |
||||
8 мар 21, 15:29 [22291194] Ответить | Цитировать Сообщить модератору |
Dima T Member Откуда: Сообщений: 15698 |
Как ты к карте обращаешься? Хэндлы (HANDLE) объектов виндавса есть? Если есть, то с сериализацией будет засада 22291172 |
||||
8 мар 21, 18:55 [22291246] Ответить | Цитировать Сообщить модератору |
jenya7 Member Откуда: Сообщений: 1349 |
выше я показал код. производитель карты дал dll. через него я нахожу подключенные карты по USB и работаю с ними. так как это USB то непонятно как сохранять объект. скажем в случае UART доступ к COM порту с любого exe тривиален. |
||||||||
9 мар 21, 09:24 [22291403] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 3 [все] |
Все форумы / WinForms, .Net Framework | ![]() |