问题
我的问题是:C# 本身支持后期绑定 IDispatch 吗?
Pretend我正在尝试自动化 Office,同时与客户安装的任何版本兼容。
在 .NET 世界中,如果您在安装了 Office 2000 的情况下进行开发,则从现在到世界末日,每个开发人员和每个客户都需要拥有 Office 2000。
在 .NET 之前的世界中,我们使用COM与 Office 应用程序对话。
例如:
1)使用与版本无关的ProgID
"Excel.Application"
其结果是:
clsid = {00024500-0000-0000-C000-000000000046}
然后使用 COM,我们要求将这些类之一实例化为一个对象:
IUnknown unk;
CoCreateInstance(
clsid,
null,
CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
IUnknown,
out unk);
现在我们开始比赛了 - 能够从我的应用程序内部使用 Excel。当然,如果really你想使用该对象,你必须调用有某种调用方法的方法。
We could掌握各种界面声明,翻译成我们的语言。这个技术很好,因为我们得到
一些示例代码可能是:
Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;
但使用接口有一个缺点:我们必须掌握各种接口声明,并将其翻译成我们的语言。我们陷入了使用基于方法的调用的困境,必须指定所有参数,例如:
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);
在现实世界中,这已被证明具有我们愿意放弃的缺点:
并改为使用智能调度后期绑定:
Variant xl = (IDispatch)unk;
Variant newWorksheet = xl.Worksheets.Add();
由于 Excel 自动化是为 VB 脚本设计的,因此可以省略许多参数,即使没有它们也不会发生重载。
Note:不要将我的 Excel 示例与我想要使用 IDispatch 的原因混淆。并非每个 COM 对象都是 Excel。某些 COM 对象除了通过 IDispatch 之外没有其他支持。