VSTO:Visual Studiodevise人员重复使用运行Excel实例,而不是自行启动

在Visual Studio中创buildVSTO Workbook项目时,VS会创build一个新的Excel(xlsx)文件,并允许您直接从Visual Studio中进行编辑。 Excel工作簿出现在一个新的选项卡中,旁边是任何代码或表单:

从Visual Studio中编辑Excel工作簿的示例

为了支持这个,Visual Studio需要在devise时运行一个EXCEL.EXE实例。

问题是,不幸的是,而不是总是运行自己的实例,如果它发现一个已经运行它将使用该实例。 所以如果由于某种原因,我的电脑上已经打开了Excel,Visual Studio将会重用这个实例。

这会导致几个问题:如果Excel正在运行一个长计算,它将冻结Visual Studio; 如果在VS中我打开一个模态Excel窗口(例如单元格或字体属性),它冻结了我现有的Excel窗口(VS之外)。 如果VS崩溃,Excel.exe仍然有一个项目的Excel文件的句柄,但我不能杀了它,因为我在Excel中的其他打开的文件。 最后,如果我碰巧在PC上打开了Excel 2003,并且我的项目使用的是Excel 2007,VS 仍然会尝试使用当前正在运行的2003实例,这会在被要求打开2007文件时感到困惑,请尝试将其转换等等,这导致了一个完整的混乱。

唯一的解决办法是closures所有EXCEL.EXE实例,只有在运行VS之后,打开VSTO项目,VS才会find没有正在运行的excel实例并自己运行,然后我可以重新打开我之前打开的文件在我打开自己的新事例。 这并不总是可能的,但可能是一个真正的痛苦,所以我想find一种方法让VS每次都打开自己的个人新实例。

您是否尝试过更改VS中项目的DEBUG选项,以明确指向Excel.exe并在Excel命令行中命名项目XLSX文件?

这是我能想到的唯一一种总是获得第二个excel实例的东西。

Office应用程序倾向于使用现有的实例,所以这种行为并不让我感到意外。 单词也可能很棘手。

而当你开始谈论在单个开发机器上加载多个版本的Office时(我也这样做),事情会变得非常奇怪。

这个简单的C#控制台应用程序可以打开一个空白的,不可见的EXCEL.EXE进程。 您可以安排此程序在任何其他Excel实例启动之前login时运行。

 using System; using System.Runtime.InteropServices; //C:\Program Files (x86)\Microsoft Visual Studio 11.0\Visual Studio Tools for //Office\PIA\Office14\Microsoft.Office.Interop.Excel.dll using Excel = Microsoft.Office.Interop.Excel; class Program { [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); const int SW_HIDE = 0; const int SW_SHOW = 5; static void Main(string[] args) { Console.WriteLine("Opening new excel process..."); var handle = GetConsoleWindow(); ShowWindow(handle, SW_HIDE); try { Excel.Application Ea = new Excel.Application(); Ea.Workbooks.Add(); Ea.Visible = false; } catch (Exception exep) { Console.WriteLine(exep.Message); Console.ReadKey(); } } }