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

Posted

技术标签:

【中文标题】Excel 加载项在类库之间共享内存【英文标题】:Excel Add-In sharing memory between Class Libraries 【发布时间】:2012-02-02 18:04:28 【问题描述】:

环境: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)application;) 进行交互。 “加载项”中的所有交互都是通过 COM (InvokeMember) 完成的。 List&lt;BusinessClass&gt; 是从“加载项”创建和填充的

项目«公式»:类库。一个 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&lt;BusinessClass&gt;. 当 Excel 用户在单元格中输入“=MyUdfFunction(6 ;7)”时,会调用我在“公式”中的方法。 由于它来自不同的进程(来自 Excel),UDF 无法访问“业务”实例,并且无法访问 List&lt;BusinessClass&gt;

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

我知道当你在不同的进程中时,你不能使用来自其他进程的数据。

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

提前致谢 让·玛丽

【问题讨论】:

【参考方案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。

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢 Charles,我已经联系了 Add-In Express,看看他们的模型是否能解决我的问题。

以上是关于Excel 加载项在类库之间共享内存的主要内容,如果未能解决你的问题,请参考以下文章

lutorpy 用于 python 和 torch 之间的共享内存

什么?面试官问我Java内存模型!这不得给我加薪?

什么?面试官问我Java内存模型!这不得给我加薪?

在共享内存中共享std :: string

已加载共享对象的内存使用情况

共享内存