Исключение при вызове RTD-сервера из Excel - PullRequest
1 голос
/ 22 февраля 2011

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

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

В таблицах я вызываю функцию-обертку для RTD, как показано ниже (* snipped):

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]
   }
}

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

  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-сервере, и как только данные становятся доступны, исключение заменяется правильными данными. Кроме того, если я NOT пересчитываю ячейки, они отображают сохраненное значение и затем корректно обновляют полученное значение, как только становятся доступны данные.

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

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

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

EDIT:

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

Ура, Che

1 Ответ

1 голос
/ 23 февраля 2011

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

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

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

-Govert

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

...