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