我正在编写一个具有多个潜在用户界面的应用程序,我正在使用MEF在启动期间注入适当的实现。 IDisplay
的一个实现使用ExcelDNA(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插件的路径来加载它(如上所述)。
答案 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或类似的东西。