【问题标题】:Passing a COM method default parameter传递 COM 方法默认参数
【发布时间】:2015-12-07 21:40:35
【问题描述】:

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

【问题讨论】:

  • (string, string)重载真的存在吗?错误信息是不言自明的。
  • 是的,它确实存在,但我将 System.Reflection.Missing.Value 作为第二个参数传递,它不是字符串。
  • 我认为 COM 没有默认方法。 C# 可以,但并非所有 C# 功能都在 COM 中公开。
  • 是的,COM 肯定有默认方法。我可能不得不在至少完全支持可选参数的 VB.net 中编写调用代码。
  • myinstance.generatecsvdocument("mystring") ?

标签: c# com


【解决方案1】:
  object missingValue = System.Reflection.Missing.Value;

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

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

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

【讨论】:

  • 谢谢,实际上不可能更改该方法,因为我无法更改调用它的另一位代码。我只是从 C# 调用它来测试我的 c# COM 代码,所以我可以更改为使用我认为会更好的 VB.net。
  • 嗯,常见的错误。你并没有真正测试任何东西,CLR 不是那么容易被愚弄的。在运行时可以看到它实际上是一个 .NET 程序集并且不会使用 COM 互操作。您不妨通过添加程序集引用来测试它,该默认值现在可以工作了:)
  • 谢谢我已经尝试过了,但是使用接口作为变量的类型。如果我切换到实际的类而不是界面,它可以“看到”默认值。
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2016-03-25
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多