c# - 是否可以确定 COM 互操作类型中可选参数的默认值?

标签 c# c#-4.0 com

我正在使用 C# 4.0 实例化一个 Excel.Application 并打开一个 Excel.Workbook。精简后,我的代码如下所示:

Excel.Application xlApp;
Excel.Workbook xlWorkBook;

xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open("someFile");

Open() 方法有很多我不需要提供的可选值。这很方便,除了我不知道那些可选参数的默认值是什么。因此,我无法决定是否必须提供一个值。

在这种情况下,我可以在 MSDN 文档中找到有关一些参数的所需信息。是否有通用方法来确定 COM 互操作类型中可选参数的默认值?

更新:

MSO.dll 上使用oleview,我检查了Workbook 接口(interface)的相应IDL。对于 SaveAs() 方法,它看起来像这样:

HRESULT SaveAs(
    [in, optional] VARIANT Filename,
    [in, optional] VARIANT FileFormat,
    [in, optional] VARIANT Password,
    blahblah...
    [in, optional, defaultvalue(1)] XlSaveAsAccessMode AccessMode,
    blahblah...
    [in, optional] VARIANT Local,
    [in, lcid] long lcid);

在 Visual Studio 中,intellisense 为大多数参数显示 [object Filename = Type.Missing],我认为这是有道理的,因为 IDL 不提供任何关于类型的信息(VARIANT) 或任何默认值。然而,对于参数 AccessMode,IDL 提供了所需的信息,智能感知显示了它。

所以我猜现在的问题变成了:为什么 IDL 没有更具体地说明所有参数的类型(和默认值),就像 AccessMode 一样?

最佳答案

why is the IDL not more specific about the type (and default value)

特定于类型,它是 VARIANT。它不必具体说明默认值,变体能够指定“未指定”。实际上,在类型库中指定默认值是可能的,您从逆向工程 IDL 中看到了这一点。

这里有很多灵 active 。但是,如果变体值“未指定”,则 COM 服务器将替换它认为是默认值的任何值,或者为未指定的值提供特定行为。找出可能是什么的唯一方法是通过文档。这确实并不总是很出色。

关于c# - 是否可以确定 COM 互操作类型中可选参数的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266710/

相关文章:

jquery - 在 Mvc2 中使用 jquery 在我的页面中加载部分 View 时如何进行客户端验证

c# - 在 C# 中使用 COM IDispatch::GetTypeInfo() 时发生内存泄漏

c# - 使用 COM 将结构或字符串数​​组从 C++ 传递到 C#

c# - 如何在 asp.net 中使用 System.Web.Caching?

C# decimal.Parse 行为

c# - 使用暂存表的一般观点是什么?我们经常将它们用于从外部供应商进口订单

asp.net - 如何使用 foreach 循环清除所有文本框?

c# - 事务死锁和 DBContext

c# - 将指数数转换为整数

c# - 将对象传递给 COM 方法