我正在使用 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/