2016-03-15 5 views
1

Я видел это в нескольких вопросах, но многие из принятых ответов противоречивы.Библиотека в GAC, используемая несколькими приложениями, имеет ли она одни и те же объекты или нет?

Некоторые говорят, что только IPC может использоваться, если вы хотите использовать один экземпляр (фактически только синхронизированный экземпляр) объекта через приложения и домены.

Другие говорят, что использование шаблона singleton в сборке в GAC приведет к совместному использованию данных, поскольку GAC будет совместно использовать экземпляр, если DLL уже загружена другой сборкой (при условии, что lib имеет одноэлементный шаблон).

Кто-то помогает мне и успокаивает меня, мне нужно разделить глобальный объект на несколько приложений в нескольких потоках и знать, прежде чем я заберусь слишком далеко, если это возможно даже без IPC, таких как WCF. Я бы предпочел использовать GAC, так как моя библиотека больше похожа на инфраструктуру, которая будет использоваться набором приложений, разработанными мной и другими сторонними разработчиками. Кроме того, скорость является серьезной проблемой, и сериализация/десериализация объекта для постоянной синхронизации, вероятно, добавит слишком много латентности, скорее всего, это единственный экземпляр, на который ссылаются несколько мест.

ответ

2

Нет, каждый экземпляр приложения использует собственную память для всех загруженных сборок. Можно даже разделить два экземпляра одного экземпляра в одном приложении (с помощью AppDomains)

Одноэлементный шаблон можно использовать с крестообразным монтажом, но это всегда будет находиться в пределах одного AppDomain.

Таким образом, два приложения не используют экземпляры памяти/объекта.

Это желательно поведение, потому что вы не хотите, чтобы другие приложения, чтобы получить доступ к теме/Диспетчеру/AppDomain (и загрузить пользовательскую сборку в приложении)/экземпляры класса Application


Если вам нужно «поделиться» памятью или объектами между приложениями, вам нужно будет сериализовать данные и «перенести» их на что-то вроде уровня связи.

Например:

  • TCP/IP
  • 'Общий' памяти (именованные каналы)
  • Файлы
+0

Так РАЗВЕЙТЕ вопрос, держа быстро меняющийся набор данных (сотни изменений в секунду), синхронизированный между приложениями с минимальной латентностью, каков наилучший метод? Кажется, что все они связаны с сериализацией/десериализацией, которая будет иметь свою собственную задержку. – Wobbles

+0

_ «сотни изменений в секунду» _ Если данные нестабильны, вы должны отправить только несколько. В основном для использования волатильных данных используется UDP. (например, места в игре). Если данные нестабильны, вам, вероятно, не понадобится «сотни изменений в секунду». Можете ли вы «предсказать» следующее значение? (например, движущийся объект) –

+0

он связан с аппаратным вводом, поэтому волатильность необходима, поскольку источник данных нестабилен. – Wobbles