在 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".
我希望能够从 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".