2009-02-13 90 views
4

我有一个C#Excel插件项目“MyExcelAddIn”,它有一个公共方法Foo()来做一些复杂的事情。为了测试的目的,插件还定义了一个连接到Foo()的工具栏按钮,这样我就可以测试它并验证点击按钮调用Foo()并做我想做的事情。这可以。如何从单独的C#项目调用VSTO AddIn方法?

现在我想从C#Windows窗体项目调用此方法。在Windows Forms项目中,我可以创建一个Excel实例并使其可见,并验证我的VSTO加载项正在运行,因为我可以看到该按钮并且它可以工作。但我不能解决如何从Windows窗体项目编程调用Foo()。我已经搜索了一下,并获得了“MyExcelAddIn”COMAddIn对象,但无法弄清楚如何调用Foo()。

它看起来是这样的:

// Create Excel and make it visible 
Application excelApp = new Application(); 
excelApp.Visible = true; 

// I know my VSTO add-in is running because I can see my test button 
// Now get a reference to my VSTO add-in 
Microsoft.Office.Core.COMAddIns comAddIns = _excelApp.COMAddIns; 
object addinName = "MyExcelAddIn"; 
Microsoft.Office.Core.COMAddIn myAddin = comAddIns.Item(ref addinName); 
// This works, but now what? How do I make a call on myAddin? 
// Note that myAddin.Object is null... 

所以我想知道我能做些什么来调用foo()从我的Windows窗体应用程序。请注意,我完全控制了Windows窗体应用程序和加载项,我怀疑我必须对它们(特别是加载项)进行更改,但我不知道如何执行此操作。

注意,这是一个VS2008 C#应用程序,我用Excel 2003

回答

1

我正在使用SendMessage Win32 API来执行此操作。我的C#外接程序创建一个具有WinForm应用程序可以定位的uniqe窗口标题的“NativeWindow”。

+0

如何做到这一点?任何教程?我在哪里可以得到这个SendMessage Win32 API? – 2011-09-22 07:47:01

0

我假设你的foo方法在某种程度上与Excel交互。否则,您可以使用Foo方法添加对包含该类的程序集的引用,并从那里调用它而不实例化Excel。

我能想到的唯一方法是通过excelApp对象获取对CommandBarButton的引用。 CommandBarButton有一个名为Execute的方法,类似于单击按钮。类似这样的:

 Excel.Application excelApp = new Excel.Application(); 
     CommandBarButton btn = excelApp.CommandBars.FindControl(...) as CommandBarButton; 
     btn.Execute(); 
+0

谢谢,这是一个巧妙的方法,但我一直在寻找一个更通用的方法,因为超出了简单的测试应用中,我们有很多的方法,当然有的用参数等不希望为每个创建一个隐藏按钮他们(以及如何处理参数)。 – 2009-02-13 07:58:15

4

如果你正在构建一个应用程序级的插件,我认为这可能是你的答案:MSDN VSTO Article

它包括两个步骤:(文章)

  1. 在您添加 - 将一个对象暴露给其他解决方案。
  2. 在另一个解决方案中,访问由加载项公开的对象,并调用该对象的成员。

另一种解决方案可能是:(再次从文章)

  • 是在不同的进程比你加载(运行的任何解决方案,这些类型的解决方案也被称为失处理客户)。这些应用程序包括自动化Office应用程序的应用程序,如Windows窗体或控制台应用程序,以及在不同进程中加载​​的加载项。
+0

这应该是答案! – 2010-11-23 14:14:35

0

对于其他人谁在这里发现这就是我所做的:

 object addInName = "AddinName"; 
     var excelApplication = (Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
     COMAddIn addIn = excelApplication.COMAddIns.Item(ref addInName); 

     addIn.Object.AddinMethodName(params); 

也不得不COM和Excel.Interop下装配在添加引用Microsoft.Office.Core。