Надстройка Excel, разделяющая память между библиотеками классов - PullRequest
0 голосов
/ 02 февраля 2012

Среда: C #, .NET 3.5, Windows 7 64, Excel 2007, Visual Studio 2010

У меня VS2010 с 3 проектами:

Projet «Business»: Библиотека классов с глобальной статической переменной

List<BusinessClass> 

Проект «Надстройка»: Расширяемая совместно используемая надстройка и класс надстройки:

[GuidAttribute("A9E83593-395F-4112-855D-A68C5088151F"), ProgId("eFrontCubeAddIn.CubeAddIn")]
public class CubeAddIn : Object, Extensibility.IDTExtensibility2, ICustomTaskPaneConsumer {…}

Excel вызовет OnConnection, и я буду использовать объект Excel (приложение ExcelApp = (Excel.Application);) для взаимодействия.Все взаимодействия внутри надстройки осуществляются через COM (InvokeMember).List<BusinessClass> создается и заполняется из «Надстройки»

Проект «Формулы»: Библиотека классов.Одна UDF Excel специфическая формула.Методы создаются с использованием следующей модели и регистрируются с использованием [ComRegisterFunctionAttribute] RegisterFunction (Type type)…

[Guid("5268ABE2-9B09-439d-BE97-2EA60E103EF6")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyFunctions {
public double MyUdfFunction(double number1, double number2) {
{
return number1 * number2;
}

Моя проблема очень проста для объяснения: у меня есть лента и настраиваемая панель в проекте «Add In»Заполнение List<BusinessClass>. Когда пользователь Excel вводит« = MyUdfFunction (6; 7) »в ячейку, вызывается мой метод в« Формуле ».Поскольку это происходит из другого процесса (из Excel), UDF не имеет доступа к экземплярам «Business», а List<BusinessClass> недоступен.

UDF иногда можно вызывать более 500 000 раз.хочу вставить скрипт VBA, вызывающий мой UDF в цикле.По соображениям скорости я не хочу использовать общую память, именованные каналы, WCF или другие артефакты.Не хочу использовать службы UDF (не могу использовать сервер Sharepoint).

Я знаю, что когда вы находитесь в другом процессе, вы не можете использовать данные из других процессов.

Любая идеядать «Формуле» прямой доступ к «Бизнесу»?Как будто все 3 проекта выполняются в одном процессе ...

Заранее спасибо Жан Мари

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Ваш проект "Формулы" является надстройкой Excel Automation.Надстройка Express позволяет вам иметь надстройку COM и надстройку XLL в одной сборке;они будут загружены в один и тот же домен приложений, отметьте Как: создать надстройку COM, сервер XLL UDF и RTD в одной сборке .Точнее, надстройка автоматизации может быть реализована в той же сборке, но вы не можете загрузить надстройку автоматизации в одном домене приложений в всех ситуациях.

Также обратите внимание на другуюblog: Вызов надстройки COM из надстройки Excel XLL: расширенный пример .

1 голос
/ 03 февраля 2012

Для скорости вам необходимо использовать интерфейс XLL, где это возможно, особенно для UDF.Я предлагаю вам взглянуть на использование Addin Express (стоит) или Excel DNA (бесплатно), оба из которых предоставляют вам .NET-интерфейсы для Excel, используя как Interop-COM, так и XLL в процессе.

...