Несколько экземпляров C# Excel RTD Server отключают все формулы на одном листе, останавливают формулы на другом

Я создал RTD-сервер для Excel на C#, который постоянно обновляет ячейки данными и должен работать с несколькими экземплярами Excel. Проблема заключается в том, что если у меня есть одна и та же формула RTD более чем в одном экземпляре Excel, и я удаляю формулу в одном из экземпляров Excel, она вызывает метод DisconnectData на сервере RTD, поэтому идентичные формулы в других экземплярах Excel перестают обновляться. даже если они все еще должны обновляться.

Есть ли способ в С# заставить каждый экземпляр Excel иметь свой собственный RTD-сервер или есть ли способ для RTD-сервера правильно распознавать несколько экземпляров Excel и проверять, что все экземпляры формулы были удалены из всех книг excel перед вызовом метод DisconnectData на моем сервере RTD.


person Megaman82    schedule 30.05.2013    source источник


Ответы (2)


Предполагая, что ваши RTD-функции обернуты в UDF, одним из решений будет присвоение каждому рабочему листу идентификатора (например, Guid) из вызова UDF. Вы можете сохранить идентификатор в качестве пользовательского свойства рабочего листа, а затем добавить его к каждой исходящей теме RTD, что приведет к созданию уникального набора тем для каждого рабочего листа, когда они поступят на ваш сервер RTD.

Однако доступ к пользовательскому свойству листа с каждым вызовом RTD будет влиять на производительность при обработке большого количества функций, поэтому вам следует кэшировать идентификатор на короткий период времени, чтобы смягчить это. Один из способов сделать это - поддерживать поиск в словаре с ключом объекта рабочего листа. В рамках каждого вызова UDF получите рабочий лист, с которым связана вызывающая ячейка, через свойство Application.Caller (приведите его к диапазону и получите из него свойство рабочего листа), а затем найдите идентификатор в словаре.

person bradmo    schedule 16.07.2013

Я думаю, это ваша проблема http://support.microsoft.com/kb/284883 Как сделать вы регистрируете свой сервер RTD? Это объект DCOM?

person Denis Zaikin    schedule 05.06.2013
comment
Я наткнулся на эту статью, когда пытался найти ответ, но в ней был только пример VB, и я не мог найти, как это сделать с помощью C#. Он был зарегистрирован через Visual Studio, пометив DLL как COM-Visible и зарегистрировав для COM-взаимодействия. Сервер RTD — это просто COM-объект, а не DCOM. - person Megaman82; 05.06.2013
comment
Вы смотрели эту статью msdn .microsoft.com/en-us/library/windows/desktop/ ? В своей практике я использовал CLSCTX_INPROC_SERVER в CoCreateInstance - person Denis Zaikin; 06.06.2013