ExcelDNA记忆空间

时间:2014-05-19 12:39:23

标签: memory interop mef excel-dna

我正在编写一个具有多个潜在用户界面的应用程序,我正在使用MEF在启动期间注入适当的实现。 IDisplay的一个实现使用ExcelDNA(Excel是界面)。代码通过

启动Excel作为一个过程
var processInfo = new ProcessStartInfo
{
    FileName  = PATH_TO_EXCEL,
    Arguments = PATH_TO_EXCELDNA_ADDIN
};

Process.Start(processInfo);

除了Excel现在处于单独的内存空间之外,这种方式正常,因此UI回调(即功能区按钮单击)无法访问任何注入或分配的属性。

一种可能的解决方案是首先启动Excel,然后使用ExcelDNA的AutoOpen()挂钩(在Excel中加载后调用它)调用bootstrapper类来配置MEF但是我想知道是否可以在C#和Excel进程之间共享内存?通过Excel.Application app = new Excel.Application { Visible = true; }启动Excel会解决吗?我会尝试这个,但是无法找到如何指定ExcelDNA插件的路径来加载它(如上所述)。

1 个答案:

答案 0 :(得分:3)

Excel将始终作为单独的进程运行。因此,您无法在Excel流程和其他流程之间共享内存。但是,C#代码可以在Excel进程内运行 - 这正是Excel-DNA加载项的工作方式。

您还可以在Excel流程和其他流程之间进行通信。一个选项是使用COM Automation互操作 - 当您从自己的可执行文件中调用new Excel.Application时,这就是您正在执行的操作。您正在启动单独的Excel进程(或连接到现有正在运行的进程),然后返回进程间通信代理(Application对象)。

如果您想告诉Excel进程加载Excel-DNA加载项,可以调用Application.RegisterXLL(path_to_add_in)让它加载.xll。如何连接Excel-DNA加载项以及其余代码仍然需要解决。

您可能仍然需要某种跨进程通信,例如.NET Remoting,带有命名管道的WCF或类似的东西。