环境: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个项目一样......
提前致谢 让·玛丽
答案 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。