传递COM方法的默认参数

时间:2015-09-11 10:44:05

标签: c# com

我有一个用C#编写的ComVisible COM类。我想使用COM从另一个C#位代码调用它并传递参数的默认值。我可以在没有默认参数的情况下调用大量其他方法。

这是我能想到的最好的。前两行适用于我所有其他方法。

Type mytype = Type.GetTypeFromProgID("MyType");
dynamic myinstance = Activator.CreateInstance(mytype);
object missingValue = System.Reflection.Missing.Value;
myinstance.generatecsvdocument("mystring", ref missingValue);

我的方法如下:

public void generatecsvdocument(string mystring, string rowseperator = "\n")

当我运行它时,我收到错误:

  

'generatecsvdocument的最佳重载方法匹配(字符串,   string)'有一些无效的参数

1 个答案:

答案 0 :(得分:2)

  object missingValue = System.Reflection.Missing.Value;

这在这里不起作用。它仅对采用VARIANT作为参数的COM方法有效。在C#中看起来像 object dynamic 。与C#支持的一种非常不同的默认参数机制,是被调用者确定默认值。在C#中,调用者决定它,C#编译器使用元数据来知道默认值。

Missing.Value在运行时使用值DISP_E_PARAMNOTFOUND变为类型为vtError的变体。发信号通知COM方法以使用默认值。实际上并不常用,通常只在支持脚本语言的COM服务器中实现。办公室自动化是最常见的例子,可能是启发你尝试这一点的原因。

但不,你的论点是 string ,而不是变种。使用后期绑定时无法发现默认值,隐含的是您对元数据中存储的默认值一无所知。否则,vtError机制存在的原因,脚本语言有同样的问题。获得成功的唯一真正方法是重写方法并测试 null 参数,如果是这种情况,则用“\ n”代替。