为什么不能通过后期绑定访问来自不同 DLL 的枚举?

Why can't enumerations from different DLLs be accessed through late binding?

我试图找出如何使用 C# 通过 COM 互操作性访问 Excel 的枚举。

使用早期绑定很简单,但使用后期绑定我只发现我可以访问 same file 中的枚举。

如果枚举在不同的 DLL 中,它们 can't be accessed. So either I use the integer values 或创建我自己的枚举。

难道真的不能通过后期绑定访问它们吗?如果是这样,为什么?我希望早期绑定是由 IDE 左右简化的后期绑定代码。

If the enumerations are in a different DLL they can't be accessed. So either I use the integer values or create my own enums.

根据定义,不可能通过后期绑定访问预定义的enums。显然,对于 .NET,它们将显示为 "integers"。当然,您可以将一些 int 转换为您定义的 enum 或者可能是 constant,但是这样的代码只是为了您的利益,并不代表 COM 库通常发布的强合同.

Is it really not possible to access them through late binding? If so, why? I would expect that early binding is late binding code made easy by the IDE or so.

早期绑定 使用 COM 类型库或 COM Interop 库。这些本质上是通过提供 C# 或 VB.NET-熟悉的类型围绕 COM 类型的 .NET 包装器。有了它,您就可以以语句完成的形式获得智能感知;参数帮助;和方法帮助。编译器将帮助您解决编译时可能犯的任何错误。仅当存在类型库或 COM 互操作库时,早期绑定才有效。

后期绑定 不会以智能感知的形式为您提供任何信息。没有指示哪些对象可用;目前有哪些方法;也没有传递什么参数。您的代码可能会编译,但您仍然可能会遇到运行时错误。后期绑定既不使用也不要求类型库或 COM 互操作库。

此外,术语后期绑定 表示 COM 特有的内容。它通常涉及调用 IDispatch 来获取方法名称列表。我不确定 .NET 的 enumType.GetField("Bar").GetValue() 是否符合条件。

后期绑定示例

后期绑定 C# 代码:

// You will get no intellisense help here
var progId = "Excel.Application";
dynamic excelApp = Activator.CreateInstance(Type.GetTypeFromProgID(progId));
excelApp.Workbooks.Add = true;             // VS happily lets me type all this
dynamic workSheet = excelApp.ActiveSheet;  // hope this all works at runtime

是否延迟绑定

Isn't this example accessing an enum via late-binding with reflection? The difference is that it only works for the same file

也许,这是后期绑定的一种形式。我可能会使用术语 decoupled.

COM 世界中的后期绑定通常用于以下一种或多种情况:

a) 不知道你将提前连接什么

b) 你确实知道,但你无权访问任何类型库,因为它未安装或开发人员从未创建它

c) 想要将您的应用程序与任何特定版本的 COM 库分离

您提供的使用 enumType.GetField("Bar").GetValue(null); 的示例告诉我一些事情:

  1. 你知道你正在处理 Excel
  2. 您可以访问 "type library" 的一种形式 - 一种包含定义的形式。在这种情况下枚举常量
  3. 你有点耦合Excel

考虑到这一点,我不确定你为什么要走晚点路线。你似乎采取了更难的方法。

告诉我更多