Исключение при вызове RTD-сервера из Excel

Я написал надстройку VSTO для Excel с использованием Visual Studio 2010, и после того, как мне удалось обойти большинство препятствий, которые Microsoft ставит на пути праведного разработчика, мне наконец-то пришлось признать свое поражение.

Мой проект содержит ленту с некоторыми элементами управления, настраиваемую область задач, которая позволяет пользователям осуществлять поиск в базе данных через интерфейс RESTful, и RTD-сервер, который позволяет им размещать эти данные в своих таблицах. Пока... ну, больно, я думаю: после большой борьбы с Interop, ComVisibility и AppDomains (что за отличная идея!) Мой текущий статус выглядит следующим образом.

На рабочих листах я вызываю функцию-обертку для RTD, как показано ниже:

Public Function call(value as String)
    Dim addin as Office.ComAddIn
    Set addin = Application.ComAddIns("MyAddin")
    addin.Object.RTD(value)
End Function

Это (часть) класса надстройки:

namespace Some
{
   [Guid("...")]
   [ComVisibleAttribute(true)]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   public class MyAddin {
      [snip]

      public String RTD(String value)
      {
         String returner = null;
         try
         {
            returner = Globals.ThisAddin.Application.WorksheetFunction.RTD(SERVERID, "", value);
         }
         catch(COMException ce) 
         {
            returner = ce.StackTrace;
         }
         return returner;
      }
   }
}

И соответствующая часть класса RTD Server:

namespace Some 
{
   [Guid("...")]
   [ComVisibleAttribute(true)]
   [ClassInterface(ClassInterfaceType.AutoDual)]
   [ProgId("MyRTDServer")]

   public class Server : Excel.IRtdServer
   {
      [snip]
   }
}

В режиме отладки я:

  1. Создать пустую новую книгу
  2. Добавить формулу "=RTD(...)" в ячейку
  3. Добавить вызов функции-оболочки "=call(...)" в ячейку
  4. Сохранить книгу
  5. Откройте книгу
  6. Остановите отладку и запустите ее снова
  7. Откройте книгу

Я наблюдаю:

  • На 3 все отлично работает
  • На 5 все отлично работает
  • В 7, когда пересчитываю свои клетки, я получаю Unable to get the RTD property of the WorksheetFunction class исключение в ячейке 3) и #N/A в клетке 2). Однако я вижу, что темы регистрируются на RTD-сервере, и как только данные становятся доступны, исключение заменяется правильными данными. Кроме того, если я НЕ пересчитываю ячейки, они отображают сохраненное значение и затем корректно обновляют полученное значение, как только данные становятся доступны.

Если в развернутом режиме я наблюдаю:

  • На 2 я получаю #N/A
  • В 3 я получаю Unable to get the RTD property of the WorksheetFunction class исключение

Любая помощь, пожалуйста?:(

РЕДАКТИРОВАТЬ:

Тестирование той же процедуры с очень простым RTD-сервером в пустом проекте Addin показывает точно такие же результаты: отображается загруженный файл Excel #N/A если RTD-формула пересчитывается до того, как на сервере будут доступны данные. Я хотел бы узнать: WTF?

Ура, че

1 ответ

Ошибка "Невозможно получить свойство RTD...." - это просто способ объектной модели Excel сказать, что в вызове функции произошла ошибка.

Есть ли у вашего RTD-сервера какие-либо зависимости от остальной части вашей надстройки? Тот факт, что 2) дает сбой при развертывании, создает впечатление, что RTD-серверу необходимо инициализировать некоторые другие биты, прежде чем он начнет работать успешно. При сборке надстройки VSTO ваша сборка может быть загружена полностью отдельно для сервера RTD и для надстройки COM, а в ваших проблемных случаях экземпляр RTD загружается первым.

Возможно, вы можете протестировать образец RTD-сервера вместо своего собственного, просто чтобы убедиться, что ошибка есть, а не в оболочке или в другом месте в надстройке VSTO. Затем вы можете покопаться в своем RTD-сервере и посмотреть, что пойдет не так.

-Govert

Excel-DNA - Бесплатный и простой.NET для Excel

Другие вопросы по тегам