excel的函数应该是静态的,而COM对象方法不应该:重复“实现”真的有必要吗?

我有这个简单的function

public double MYSUM(double x, double y) { return x + y; } 

要在excel-dna中使用它,我可以

  • 声明它是static并且在它之前是一个[ExcelFunction(Description = "blah")] ,这将最终导致一个excel函数。
  • 非声明它的static和声明[ComVisible(true)][ClassInterface(ClassInterfaceType.AutoDual)]包含它的类将最终导致COM类在VBA中可调用

由于以前的情况是相互独立的static /非static要求,我得出结论,我不能一次编码( 在一个地方) MYSUM并实现使它成为一个Excel函数以及一个COM对象的方法。 我错了吗 ?

(当然,我可以做两个合适的声明,包装一个独特的double underlyingMYSUM(double, double)来完成这个工作,但是我仍然需要在两个地方写VBA和Excel的函数。

Govert在Excel-DNA邮件列表上回答 :

你对基本的Excel-DNAfunction是如何工作是正确的。

由于UDF注册可以在运行时完全dynamic完成,因此可以从您的COM类自动生成并注册UDF。 Excel-DNA注册扩展( https://github.com/Excel-DNA/Registration )表明可以采用这种方法。 特别是,“InstanceMemberRegistration”示例( https://github.com/Excel-DNA/Registration/blob/master/Source/Samples/Registration.Sample/InstanceMemberRegistration.cs )显示了如何dynamic注册实例成员。 但是你需要稍微扩展一下这个例子来处理属性,决定生命周期pipe理等。这并不意味着是一个完整的实现。

-Govert