Excel вызывает сервер автоматизации .NET из двух разных доменов приложений?

У меня есть подключаемый модуль Excel (написанный на C #) со статической переменной, которая лежит в основе кэша одноэлементных данных:

static DataCache _instance;

Доступ к нему осуществляется через три разных пути кода:

  1. Обработчики событий на ленточная панель VSTO инициализирует экземпляр, а также считывает его для отображения в вспомогательных диалогах
  2. Сервер RTD (класс, который объявлен [ComVisible] и реализует интерфейс IRtdServer) использует данные для формул RTD
  3. Набор вызовов автоматизации (реализованных в другом классе, объявленном [ComVisible]) также работают с данными. Они вызываются с помощью кода VBA, который вызывается при нажатии кнопок на листе Excel.

РЕДАКТИРОВАТЬ (# 3):

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

Весь доступ из обработчиков событий ленты происходит в домене приложений под названием «MyPlugIn.vsto». Если это ПЕРВЫЙ доступ к моему COM-объекту, то все последующие вызовы (включая вызовы RTD) происходят в том же домене приложений.

Однако если ПЕРВЫЙ доступ осуществляется через интерфейс RTD, то этот вызов и все последующие вызовы RTD происходят в Домен приложения с именем «DefaultDomain». (Это происходит при загрузке сохраненного документа со встроенными формулами RTD.) Последующие вызовы для инициализации и управления DataCache через панель инструментов по-прежнему происходят в домене приложения «MyPlugIn.vsto». Это означает, что формулы RTD всегда выполняются так, как если бы DataCache не был инициализирован (поскольку статическая переменная, установленная в одном домене приложения, остается неинициализированной в другом).

Похоже, что Excel или VSTO создают домен приложения при инициализации VSTO. Объекты, созданные через COM-взаимодействие до этой инициализации, попадают в домен приложений по умолчанию, тогда как объекты, созданные впоследствии, попадают в домен приложений VSTO.

Как я могу гарантировать, что используется один и тот же экземпляр DataCache, независимо от того, в каком домене приложений мой объект сервера RTD создается в ?

6
задан Eric 25 October 2010 в 14:43
поделиться