2015-06-26 11 views
1

Я по существу хочу сделать api для приложения, но я хочу, чтобы один экземпляр этой DLL запускался за один раз.C# Ограничение DLL только до одного экземпляра

Так много приложений также должны иметь возможность использовать DLL в одно и то же время. Как и следовало ожидать от обычного апи.

Однако я хочу, чтобы это был тот же экземпляр dll, что и различные приложения. Это из-за связи с оборудованием, которое я не хочу дублировать.

+0

Я полагаю, вы хотели использовать шаблон Singleton, но не один экземпляр dll, а имел только один экземпляр определенного объекта. – Rahul

+1

Привет, это может помочь, http://stackoverflow.com/questions/1038111/can-a-singleton-class-inside-a-dll-be-shared-across-processes –

+0

Используйте событие с именем, если событие существует, это не первый случай и не выполняется. – Richard

ответ

3

DLL обычно загружается один раз за процесс, поэтому, если ваше приложение гарантировано работает только в режиме одного экземпляра, вам больше нечего делать. У вашего единственного экземпляра приложения будет только одна загруженная DLL.

Теперь, если вы хотите «поделиться» с одним экземпляром библиотеки DLL через приложения, вам неизбежно придется прибегать к архитектуре клиент-сервер. Ваша DLL должна быть обернута в службу Windows, которая откроет API HTTP (или WCF).

+1

Как вы будете обращаться к этой точке * Однако я хочу, чтобы это был тот же экземпляр dll, что и разные приложения * – Rahul

+0

@Rahul О, я полностью пропустил этот момент. Спасибо, я уточню. –

+0

Как бы приложения верхнего уровня обменивались данными с API? – Danielhobby

0

Чтобы гарантировать загрузку одной библиотеки DLL на компьютер, вам потребуется запустить контрольную сборку в отдельном AppDomain, а затем попытаться создать именованный канал для удаленного доступа (с помощью IpcChannel) и запросить аппаратные ресурсы. IpcChannel не сможет создать второй раз в той же среде. Если вам требуется высокопроизводительная связь с вашим оборудованием, используйте удаленный доступ только для запроса и освобождения ресурса другой сборкой, используемой приложениями.

2

Вы не можете этого сделать, как вы намереваетесь сделать. Лучший способ сделать это - иметь один процесс (DLL - это не процесс), который получает и обрабатывает сообщения, а ваши многочисленные клиенты используют API (это будет ваша DLL), которая просто отправляет сообщения этому процессу.

Взаимодействие этих двух процессов (ваш единственный процесс и клиенты, отправляющие или получающие сообщения через ваш API), можно было бы сделать разными способами, выбрать тот, который вам подходит (в основном, любой вид архитектуры клиент/сервер , даже если клиенты и сервер работают на одном и том же оборудовании)

0

Mutex является одним из решений для исключительного управления несколькими процессами.

*** Но Mutex иногда будет иметь мертвый замок. Будьте осторожны, если вы используете.

+0

Я предполагаю, что вы имеете в виду то же самое, что и Леандро Тасет, но вы должны прояснить ситуацию. – AlexDev

1

Это вопрос типа XY-Problem. Ваше фактическое требование - сериализация взаимодействий с основным оборудованием, поэтому они не перекрываются. Возможно, именно об этом вы должны прямо и конкретно спрашивать.

Ваш предложил решение иметь DLL, который своего рода OS- широкий одноплодной или что-то в этом роде. На самом деле это то, о чем вы просите; хотя, по-моему, это еще не правильный подход. ОС отвечает за управление временем жизни модулей DLL в каждом процессе. Для этого есть много аспектов, но для одного: большинство экземпляров DLL уже распределяются между каждым процессом (в основном разделы кода, ресурсы и т. Д. - данные, разумеется, не делятся по умолчанию).

Чтобы решить вашу актуальной проблемой, вам придется прибегнуть к методам синхронизации нескольких процессов. В Windows это работает в основном через named kernel objects как мьютексы, семафоры, события и т. Д.Другим подходом было бы использовать IPC, как уже отмечали другие люди в своих соответствующих ответах, что опять-таки потребует от себя какой-то синхронизации.

Возможно, все это уже обработано драйвером устройства этого устройства. Каковы были бы реальные сценарии, в которых перекрывающиеся взаимодействия с базовым оборудованием негативно повлияли бы на приложения, использующие вашу DLL?

+0

Если два приложения, использующие DLL, должны попросить оборудование выполнить что-то в одно и то же или подобное время, тогда возникнет путаница результатов. Я хочу избежать этого. Решение, которое я решил сделать, было бы совместным использованием DLL. – Danielhobby

+0

@ Danielhobby Я думаю, что будет проще использовать системную систему с именем mutex для синхронизации доступа к аппаратным средствам, а не для записи службы. – AlexDev

+0

@AlexDev Я изо всех сил пытаюсь найти хороший пример мьютекса в действии. Любые идеи, где я мог бы смотреть? – Danielhobby

Смежные вопросы