在 VSTO office 插件中创建可调用函数 - COMAddIns.Object 始终为 Nothing

Creating a callable function in a VSTO office addin - COMAddIns.Object is always Nothing

我希望能够从 Excel VBA 宏调用 VSTO 插件中的函数。为了测试原理,我有以下 C# 代码。

namespace ExcelAddIn1
{
    [ComVisible(true)]
    public interface IThisAddIn
    {
        String GetText();
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public partial class ThisAddIn : IThisAddIn
    {    
        public String GetText()
        {
            return "Now is the winter of dicontent made glorius summer by this son of York";
        }       
    }
}

我有以下 VBA 脚本

Public Sub RunTest()
    Dim txt As String
    Dim AddInList As Object
    Dim ExcelAddIn1 As COMAddIn
    Dim ThisAddIn As Object

    Set ExcelAddIn1 = Application.COMAddIns("ExcelAddIn1")

    txt = ExcelAddIn1.Object.GetText()
    Sheets(1).Cells(2, 1).Value = txt
End Sub

ExcelAddIn1.Object = 无

https://docs.microsoft.com/en-gb/visualstudio/vsto/walkthrough-calling-code-in-a-vsto-add-in-from-vba 处的 Microsoft 演练似乎有点混乱。

我想我可能需要添加 RequestComAddInAutomationService 但它并不像演练中描述的那样工作。当我尝试在 RequestComAddInAutomationService 中实例化我的 class 的实例时,我得到的错误基本上告诉我我需要提供一个 ApplicationFactory 和 IServiceProvider 作为参数。

private ThisAddIn utilities;

protected override object RequestComAddInAutomationService()
{
    if (utilities == null)
       utilities = new ThisAddIn();

    return utilities;
}

IThisAddIn 派生的 class 必须不同于主 vsto class(如在 Microsoft 示例中),因此只需将您的代码替换为:

  [ComVisible(true)]
    public interface IComAddIn
    {
        String GetText();
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public  class AddInUtilities : IComAddIn
    {
        public String GetText()
        {
            return "Now is the winter of dicontent made glorius summer by this son of York";
        }
    }

对比:

    public partial class ThisAddIn
    {
        private AddInUtilities utilities;

        protected override object RequestComAddInAutomationService()
        {
            if (utilities == null)
                utilities = new AddInUtilities();

            return utilities;
        }
  ....

此外,当您在 VBA 中调用 Application.COMAddIns 时,请确保您作为参数提供的字符串对应于您的 vsto 项目的 AssemblyTitle

PS没必要"register for com interop".