locked
FAQs: 如何从外部的应用程序中调用外接程序的功能? RRS feed

  • 问题

  • 为了帮助大家更好地学习 VSTO 技术,微软论坛技术支持团队编辑了一些列的 "VSTO 常见问题及解答" 精华帖。

    本帖的主题是:如何从外部的应用程序中调用外接程序的功能?

    如果您觉得这个帖子对您的学习、工作有所帮助,请再把这个帖子分享给你的同学、同事和朋友。

    如果您想阅读更多的 "VSTO 常见问题及解答",请打开索引页面:
    http://social.msdn.microsoft.com/Forums/zh-CN/vstudiozhchs/thread/ed10f3de-40bb-4f16-81f9-25ace1f152ba


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 7:43

答案

  • 共享外接程序用COMAddIns.Object向外部应用程序公开它的功能,所以OnConnection的实现大概是这样:((COMAddIn)AddInInst).Object = new MyAutomationObject()

    然而在VSTO中不能用这种方法。这是因为只有在OnConnection功能中,设置COMAddIns.Object才被允许,而在VSTO项目中OnConnection是不可见的。

    为了在VSTO达到这种目标,我们需要重写外接程序基类中的RequestCOMAddInAutomationService。在这个功能的实现中,我们仅返回一个新的COM Visible类。

    [ComVisible(true)]

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]

    public interface IAddinUtilities

    {

        void DoSomething();

    }

     

    [ComVisible(true)]

    [ClassInterface(ClassInterfaceType.None)]

    public class AddinUtilities :

        StandardOleMarshalObject,

        IAddinUtilities

    {

        public void DoSomething()

        {

            Globals.ThisAddIn.CreateNewTaskPane();

        }

    }

     

    public partial class ThisAddIn

    {

        private AddinUtilities addinUtilities;

     

        protected override object RequestComAddInAutomationService()

        {

            if (addinUtilities == null)

            {

                addinUtilities = new AddinUtilities();

            }

            return addinUtilities;

        }

    }

    VSTO将为我们把这个返回的对象值设为当前的COMAddIn.Object的值。然后,我们可以从COMAddIn.Object中获得addInUtilities,在VBA或者外部应用程序中调用它公开的功能。

    Private Sub CommandButton2_Click()

        Dim addin As Office.COMAddIn

        Dim utilities As ExcelAddinService.addinUtilities

        Set addin = Application.COMAddIns("ExcelAddinService")

        Set utilities = addin.Object

        Call utilities.SetCellValue("a1", 456.78)

    End Sub

    关于这个内容,在Andrewblog里,现有一篇详细的文章:

    http://blogs.msdn.com/andreww/archive/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice.aspx

    至于为什么我们要使AddInUtilites继承自StandardOleMarshalObject的原因,请阅读:

    http://blogs.msdn.com/b/andreww/archive/2008/08/11/why-your-comaddin-object-should-derive-from-standardolemarshalobject.aspx

    更多的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/11e4b5aa-fd42-4261-9f97-50c434a8d25e/


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 8:47
  • 添加VB代码:    

    <ComVisible(True)> _

    <InterfaceType(ComInterfaceType.InterfaceIsDual)> _

    Public Interface IAddinUtilities

        Sub DoSomething()

    End Interface

     

    <ComVisible(True)> _

    <ClassInterface(ClassInterfaceType.None)> _

        Public Class AddinUtilities

        Inherits StandardOleMarshalObject

        Implements IAddinUtilities

     

        Public Sub DoSomething() Implements IAddinUtilities.DoSomething

            Globals.ThisAddIn.CreateTaskPane()  

        End Sub

    End Class

     

    Partial Public Class ThisAddIn

     

        Private addinUtilities As AddinUtilities

     

        Protected Overrides Function RequestComAddInAutomationService() As Object

            If addinUtilities Is Nothing Then

                addinUtilities = New AddinUtilities()

            End If

            Return addinUtilities

        End Function

    End Class


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 8:48

全部回复

  • 共享外接程序用COMAddIns.Object向外部应用程序公开它的功能,所以OnConnection的实现大概是这样:((COMAddIn)AddInInst).Object = new MyAutomationObject()

    然而在VSTO中不能用这种方法。这是因为只有在OnConnection功能中,设置COMAddIns.Object才被允许,而在VSTO项目中OnConnection是不可见的。

    为了在VSTO达到这种目标,我们需要重写外接程序基类中的RequestCOMAddInAutomationService。在这个功能的实现中,我们仅返回一个新的COM Visible类。

    [ComVisible(true)]

    [InterfaceType(ComInterfaceType.InterfaceIsDual)]

    public interface IAddinUtilities

    {

        void DoSomething();

    }

     

    [ComVisible(true)]

    [ClassInterface(ClassInterfaceType.None)]

    public class AddinUtilities :

        StandardOleMarshalObject,

        IAddinUtilities

    {

        public void DoSomething()

        {

            Globals.ThisAddIn.CreateNewTaskPane();

        }

    }

     

    public partial class ThisAddIn

    {

        private AddinUtilities addinUtilities;

     

        protected override object RequestComAddInAutomationService()

        {

            if (addinUtilities == null)

            {

                addinUtilities = new AddinUtilities();

            }

            return addinUtilities;

        }

    }

    VSTO将为我们把这个返回的对象值设为当前的COMAddIn.Object的值。然后,我们可以从COMAddIn.Object中获得addInUtilities,在VBA或者外部应用程序中调用它公开的功能。

    Private Sub CommandButton2_Click()

        Dim addin As Office.COMAddIn

        Dim utilities As ExcelAddinService.addinUtilities

        Set addin = Application.COMAddIns("ExcelAddinService")

        Set utilities = addin.Object

        Call utilities.SetCellValue("a1", 456.78)

    End Sub

    关于这个内容,在Andrewblog里,现有一篇详细的文章:

    http://blogs.msdn.com/andreww/archive/2007/01/15/vsto-add-ins-comaddins-and-requestcomaddinautomationservice.aspx

    至于为什么我们要使AddInUtilites继承自StandardOleMarshalObject的原因,请阅读:

    http://blogs.msdn.com/b/andreww/archive/2008/08/11/why-your-comaddin-object-should-derive-from-standardolemarshalobject.aspx

    更多的论坛帖子:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/11e4b5aa-fd42-4261-9f97-50c434a8d25e/


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 8:47
  • 添加VB代码:    

    <ComVisible(True)> _

    <InterfaceType(ComInterfaceType.InterfaceIsDual)> _

    Public Interface IAddinUtilities

        Sub DoSomething()

    End Interface

     

    <ComVisible(True)> _

    <ClassInterface(ClassInterfaceType.None)> _

        Public Class AddinUtilities

        Inherits StandardOleMarshalObject

        Implements IAddinUtilities

     

        Public Sub DoSomething() Implements IAddinUtilities.DoSomething

            Globals.ThisAddIn.CreateTaskPane()  

        End Sub

    End Class

     

    Partial Public Class ThisAddIn

     

        Private addinUtilities As AddinUtilities

     

        Protected Overrides Function RequestComAddInAutomationService() As Object

            If addinUtilities Is Nothing Then

                addinUtilities = New AddinUtilities()

            End If

            Return addinUtilities

        End Function

    End Class


    如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    2011年2月28日 8:48