Excel加载项在类库之间共享内存

时间:2012-02-02 18:04:28

标签: .net excel com add-in interprocess

环境:C#,. NET 3.5,Windows 7 64,Excel 2007,Visual Studio 2010

我有一个包含3个项目的VS2010:

Projet«商业»:具有全局静态变量的类库

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

我的问题解释非常简单:我在项目«添加»填充List<BusinessClass>.时有一个功能区和一个自定义窗格 当Excel用户在单元格中输入'= MyUdfFunction(6; 7)'时,将调用我在«Formulas»中的方法。 由于它来自不同的进程(来自Excel),UDF无法访问«Business»实例,List<BusinessClass>无法访问。

UDF有时可能被称为超过500.000次 出于速度原因,我不想在循环中插入调用我的UDF的VBA脚本。 出于速度原因,我不想使用共享内存,命名管道,WCF或其他工件。 不想使用UDF服务(不能使用Sharepoint服务器)。

我知道当你处于不同的过程中时,你无法使用其他过程中的数据。

是否有任何想法让“公式”直接访问“商业”实例?就像在同一过程中拥有所有3个项目一样......

提前致谢 让·玛丽

2 个答案:

答案 0 :(得分:1)

对于速度,您需要尽可能使用XLL接口,尤其是UDF。我建议您使用Addin Express(成本)或Excel DNA(免费),这两种方法都可以使用Interop-COM和XLL进行Excel的.NET接口。

答案 1 :(得分:1)

您的“公式”项目是Excel自动化加载项。 Add-in Express允许您在同一个程序集中使用COM加载项和XLL加载项;它们将加载到同一个AppDomain中,检查HowTo: Create a COM add-in, XLL UDF and RTD server in one assembly。更确切地说,自动化加载项也可以在同一个程序集中实现,但是您无法在所有情况下在同一个AppDomain中加载自动化加载项。

另请注意另一篇博客:Invoking a COM add-in from an Excel XLL add-in: advanced sample