Загружать отдельные экземпляры DLL в приложение: AppDomain, Threads или что-то еще? - PullRequest
1 голос
/ 21 февраля 2012

Я пишу приложение на основе COM-объекта от третьей стороны (без источника), включенное в ссылки на мои приложения. COM-объект создает зеркало определенных учетных данных, чтобы их можно было прочитать в другом формате (собственный формат-> MSSQL). Приложение является оберткой для COM-объекта, позволяющей взаимодействовать внутри; Сам COM-объект регулярно проверяет собственные файлы, чтобы узнать, были ли они обновлены, а затем копирует их, если они есть.

У нас много клиентов, у каждого из которых есть свой аккаунт для проприетарного формата. Мы находимся в процессе конвертации из предыдущего приложения, и как только это будет сделано, у нас будет ~ 50 клиентов, работающих таким образом. У меня уже есть приложение, которое работает только для одного клиента, и я не думаю, что было бы целесообразно иметь постоянно работающие 50 копий приложения, особенно когда кажется, что COM имеет медленную утечку памяти (argh). Таким образом, программа, которую я пытаюсь написать, будет принимать различных клиентов, сгруппированных тем или иным способом, и запускать COM для каждого в фоновом режиме, тогда как передний план обеспечивает дополнительное взаимодействие и, при необходимости, перезапуск COM-объекта.

Сначала я попытался использовать Threads / BackgroundWorker, и это, похоже, работало нормально, но после некоторой путаницы выясняется, что, несмотря на объявление COM-объекта New в каждом классе, созданном для клиента, все клиенты совместно используют один и тот же Экземпляр COM, так что только последний загруженный клиент будет когда-либо делать.

Хотя вполне может быть, что я просто делаю это неправильно (если можно, скажите, пожалуйста! Я опубликую свой код, если это будет полезно), мне кажется, мне нужен способ загрузки отдельный экземпляр .DLL для каждого клиента в программе; к сожалению, это более высокий уровень, чем там, где я нахожусь. Я читал «Области применения и рефлексию», но из того, что я смог выяснить, не похоже, что я могу легко вызывать методы и не могу использовать события (на которые я полагаюсь для обновления информации). в приложении.)

tl; dr: Каков наилучший способ загрузки отдельных экземпляров DLL, чтобы я мог манипулировать информацией и прослушивать события из COM-объекта?

1 Ответ

1 голос
/ 21 февраля 2012

Я бы предложил загрузить в отдельный AppDomains.Это даст вам довольно хороший уровень изоляции и надежности по всей системе.Самый важный момент - обработка сбоев, с помощью доменов приложений вы сможете выгрузить любой конкретный AppDomain в случае необработанной ошибки.В противном случае проблема в одном компоненте (DLL) может привести к сбою всей системы с несколькими компонентами, загруженными в отдельные потоки / сборки.

Полезные ссылки:

...