繁体   English   中英

如何从单独的C#项目调用VSTO AddIn方法?

[英]How to call a VSTO AddIn method from a separate C# project?

我有一个C#Excel加载项项目“MyExcelAddIn”,它有一个公共方法Foo()来做复杂的事情。 出于测试目的,加载项还定义了一个工具栏按钮,该按钮连接到Foo(),因此我可以测试它并验证单击按钮调用Foo()并执行我想要它做的事情。 这可以。

现在我想从C#Windows Forms项目中调用此方法。 在Windows窗体项目中,我可以创建一个Excel实例并使其可见并验证我的VSTO加载项是否正在运行,因为我可以看到该按钮并且它可以正常工作。 但我无法弄清楚如何从Windows窗体项目以编程方式调用Foo()。 我已经google了一点,得到了“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...

所以我想知道如何从我的Windows窗体应用程序中调用Foo()。 请注意,我可以完全控制Windows窗体应用程序和加载项,我怀疑我必须对它们(尤其是加载项)进行更改,但我不知道如何执行此操作。

请注意,这是一个VS2008 C#应用程序,我正在使用Excel 2003。

如果您正在构建应用程序级别的加载项,我相信这可能是您的答案: MSDN VSTO文章

它涉及两个步骤:(来自文章)

  1. 在您的加载项中,将对象公开给其他解决方案。
  2. 在另一个解决方案中,访问外接程序公开的对象,并调用该对象的成员。

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

  • 任何在与加载项不同的进程中运行的解决方案(这些类型的解决方案也称为进程外客户端)。 其中包括自动化Office应用程序的应用程序(如Windows窗体或控制台应用程序)以及在不同进程中加载​​的加载项。

我正在使用SendMessage Win32 API来执行此操作。 我的C#外接程序创建了一个“NativeWindow”,其中包含WinForm应用程序可以找到的uniqe窗口标题。

对于其他发现此问题的人来说,这就是我所做的:

        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和Assemblies下的Excel.Interop下添加对Microsoft.Office.Core的引用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM