传递 COM 方法默认参数

Passing a COM method default parameter

我有一个用 C# 编写的 ComVisible COM class。我想使用 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")

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

The best overloaded method match for 'generatecsvdocument(string, string)' has some invalid arguments

  object missingValue = System.Reflection.Missing.Value;

这在这里行不通。它仅对采用 VARIANT 作为参数的 COM 方法有效。看起来像 C# 中的 objectdynamic。一种与 C# 支持的默认参数机制截然不同的类型,它是确定默认值的被调用方。在 C# 中,它是由调用者决定的,C# 编译器使用元数据来了解默认值。

Missing.Value 在运行时产生一个 vtError 类型的变体,其值为 DISP_E_PARAMNOTFOUND。向 COM 方法发出信号以使用默认值。实际上并不那么常用,通常只在支持脚本语言的 COM 服务器中实现。 Office Automation 是最常见的示例,可能是激发您尝试此操作的原因。

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