В программе код никогда не повторяется, иначе что бы вы ни повторялись, но нет дублирования во время выполнения: метод не дублируется, а имея один метод, всегда есть один метод. Код тот же и никогда не меняется, в противном случае используются некоторые передовые методы, используемые, например, защитой кода или вирусами. Таким образом, процессор и операционная система управляют только одним экземпляром исполняемого кода, однажды загруженного в память, в СЕГМЕНТЕ КОДА, и он никогда не изменяется до конца.
Это данные в СЕГМЕНТЕ ДАННЫХ, с которыми вы работаете и которыми вы управляете различными способами распределения, используя типы, локальные переменные, члены переменных экземпляра, статические члены и классы, шаблон singleton и т. д. это изменение.
Тем не менее, каждый раз, когда исполняемый файл загружает DLL, он загружает ее копию, поэтому, если 5 приложений загружают одну DLL, в памяти будет 5 копий DLL, поэтому здесь есть 5 экземпляров синглетонов, которые, однако, уникальны для каждого. заявление. Следовательно, синглтон здесь существует в каждом экземпляре запускаемых вами процессов: у вас есть один синглтон на приложение, один на загруженную DLL. Следовательно, вы всегда видите 1
вместо InstanceNumber
: по одному в каждом приложении, но 1 + 1 + 1 + ... = много, и данные не используются совместно.
Таким образом, если вы установите myName
с разными значениями в каждом работающем приложении, каждое приложение будет иметь свое собственное измененное значение в одно и то же время, потому что оно не используется совместно и не реплицируется.
Если вы хотите, чтобы глобальный системный синглтон был общим для нескольких процессов, вам необходимо реализовать сервер с использованием некоторых технологий клиент-сервер, таких как COM/DCOM в старости.
Для этого вы не используете DLL, загруженную несколькими приложениями, чтобы поместить в нее синглтон, но у вас должно быть реальное приложение (которое, конечно, может загрузить некоторые DLL, но только этот сервер загружает их, и код синглтона может быть помещен в DLL, и я надеюсь, что это не смутит вас здесь), когда другие приложения подключаются и просят использовать предоставляемые общедоступные услуги.
Вы можете использовать множество технологий, таких как служба Windows, именованные каналы, TCP/сокеты, удаленное взаимодействие, WFC, веб-службы и т. д.
Вы окончательно поймете, когда я скажу, что база данных подобна использованию синглтона, о котором вы просите: база данных — это один и только один экземпляр (в общем), и клиенты подключаются к ней и используют, читают и пишут, создают и изменяют и удалить одно и то же местоположение данных, совместно используемое несколькими локальными и/или удаленными приложениями.
Конечно, у вас есть, например, плохой пример для демонстрации, и это сделано специально, SQLite, который может использоваться как DLL, загружаемый каждым клиентом, но эта DLL управляет одним файлом базы данных. Так что имейте в виду, что вы хотите управлять одними и теми же данными, и эта DLL делает это, потому что данные находятся не в памяти, а только в одном файле.
Таким образом, для решения вашей проблемы вам необходимо:
Создайте код синглтона.
Выберите серверную технику, адаптированную к вашим потребностям.
Поместите синглтон в исполняемый файл или в dll, загружаемый только исполняемым файлом сервера.
Создайте клиентский код.
Запустите одноэлементное приложение.
Запустите клиент или клиенты.
Некоторые методы позволяют клиенту напрямую запускать сервер, если он еще не запущен.
При необходимости вы должны запретить запуск серверного процесса несколько раз, используя GUID сборки в качестве имени мьютекса, чтобы обеспечить строгое соответствие:
Ограничение нескольких экземпляров приложения
Как ограничить приложение только к одному экземпляру
Следовательно, у вас будет два проекта в обозревателе решений Visual Studio. Visual Studio предлагает способы отладки, запуская несколько проектов одновременно:
https://docs.microsoft.com/visualstudio/ide/how-to-set-multiple-startup-projects
Вот несколько статей:
Создание службы Windows на C# (C-SharpCorner)
Разработка и установить службу Windows на C# (C-SharpCorner)
Сравнение WCF с веб-службами и .NET Удаленное взаимодействие (CodeProject)
Взаимодействие между процессами (C# Vault)
Полнодуплексное асинхронное чтение/запись с именованным Трубы (CodeProject)
Программирование сокетов на C# (C-SharpCorner)
Программирование сокетов на C# (GeeksForGeeks)
Простое взаимодействие клиент-сервер с использованием C# (CodeProject) а>
person
Olivier Rogier
schedule
19.09.2020