相关疑难解决方法(0)

C#.NET是否支持IDispatch后期绑定?


问题

我的问题是:C#nativly支持后期绑定IDispatch吗?


假装我正在尝试自动化Office,同时兼容客户安装的任何版本.

在.NET世界中,如果您安装了Office 2000,那么从现在到结束,每个开发人员和每个客户都需要拥有Office 2000.

在.NET之前的世界中,我们使用COM与Office应用程序进行通信.

例如:

1)使用版本独立的ProgID

"Excel.Application"
Run Code Online (Sandbox Code Playgroud)

解析为:

clsid = {00024500-0000-0000-C000-000000000046}
Run Code Online (Sandbox Code Playgroud)

然后使用COM,我们要求将其中一个类实例化为一个对象:

IUnknown unk;
CoCreateInstance(
    clsid, 
    null,
    CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
    IUnknown, 
    out unk);
Run Code Online (Sandbox Code Playgroud)

现在我们即将参加比赛 - 能够在我的应用程序中使用Excel.当然,如果你真的想要使用该对象,你必须调用一些方法来调用方法.

我们可以得到阿霍德不同的接口声明,翻译成我们的语言.这项技术很好,因为我们得到了

  • 早期绑定
  • 代码洞察
  • 编译类型语法检查

一些示例代码可能是:

Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;
Run Code Online (Sandbox Code Playgroud)

但是使用接口有一个缺点:我们必须得到各种接口声明,转换成我们的语言.我们坚持使用基于方法的调用,必须指定所有参数,例如:

ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);
Run Code Online (Sandbox Code Playgroud)

在现实世界中,这证明了我们愿意放弃的这些缺点:

  • 早期绑定
  • 代码洞察
  • 编译时语法检查

而是使用IDispatch后期绑定:

Variant xl = (IDispatch)unk;
Variant …
Run Code Online (Sandbox Code Playgroud)

c# late-binding idispatch

27
推荐指数
3
解决办法
2万
查看次数

标签 统计

c# ×1

idispatch ×1

late-binding ×1