从Excel VSTO项目打开WPF应用程序

我有用C#编写的VSTO Excel工具,我使用WPF窗体来显示一些数据。 WPF表单在一个不同的项目中,但与Excel VSTO项目在同一个解决scheme中。 如果我用Excel在同一个线程中打开WPF表单,它会以某种方式损坏Excel,并开始做一些奇怪的事情。 但是,如果我在不同的线程中运行WPF表单,一切正常。 所以下面的代码应该是OK的:

if (app != null) { // When click the button again and WPF form is opened already, bring it on top. BringDatabaseToFront(); } else { t = new Thread(() => { app = new App(_synchronizationContext, currentCaller); App.ResourceAssembly = app.GetType().Assembly; app.InitializeComponent(); app.ShutdownMode = System.Windows.ShutdownMode.OnMainWindowClose; /* Makes the thread support message pumping * Dispecher is the Context of the WPF DB form */ Dispatcher.Run(); }); // WPF MUST be on a single-threaded apartment t.SetApartmentState(ApartmentState.STA); t.Start(); } 

当我closures工具(Excel)时,问题就开始了。 它冻结并永远冻结。 我已经尝试了许多不同的方式来closuresWPF窗体,但唯一能够工作并closures所有窗体的方法是:

 public void ShutDownAttempt() { Environment.Exit(0); } 

这有效,但现在我有另一个问题。 如果用户打开了其他几个Excel工作簿,则该代码将closures所有这些工作簿,而不会有任何警告,即使他们有未保存的数据。 所以这是危险的

看起来如果在主应用程序的另一个线程上运行它,closuresWPF应用程序并不那么容易。 有没有人有使用Excel中的WPF表单的经验?

尝试使用其调度App调用AppShutdown()方法:

 app.Dispatcher.Invoke(()=> { app.Shutdown(); });