Исключение при вызове 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]
}
}
В режиме отладки я:
- Создать пустую новую книгу
- Добавить формулу "=RTD(...)" в ячейку
- Добавить вызов функции-оболочки "=call(...)" в ячейку
- Сохранить книгу
- Откройте книгу
- Остановите отладку и запустите ее снова
- Откройте книгу
Я наблюдаю:
- На 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