传递一个COM方法默认参数

本文关键字:COM 方法 默认 参数 一个 | 更新日期: 2023-09-27 18:12:30

我有一个用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,字符串)'有一些无效参数

传递一个COM方法默认参数

  object missingValue = System.Reflection.Missing.Value;

这在这里行不通。它仅对以VARIANT作为参数的COM方法有效。看起来像c#中的objectdynamic。这是一种与c#所支持的默认实参机制非常不同的机制,由被调用方决定默认值。在c#中,它是由调用者决定的,c#编译器使用元数据来知道这个默认值。

失踪。Value在运行时转换为vtError类型的一个变体,其值为DISP_E_PARAMNOTFOUND。通知COM方法使用默认值。实际上并不常用,通常只在支持脚本语言的COM服务器中实现。办公自动化是最常见的例子,可能正是它激发了你的灵感。

但是不,您的参数是字符串,而不是变体。当您使用延迟绑定时,也没有办法发现默认值,这意味着您对存储在元数据中的默认值一无所知。否则vtError机制存在的原因,脚本语言也有同样的问题。唯一真正的方法是重写方法并测试null参数,如果是这种情况,替换为"'n"。