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



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

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

如果枚举位于不同的 DLL 中,则无法访问它们。因此,我要么使用整数值,要么创建自己的枚举。

真的无法通过后期绑定访问它们吗?如果是这样,为什么?我希望早期绑定是 IDE 左右使后期绑定代码变得容易。

如果枚举位于不同的 DLL 中,则无法访问它们。因此,我要么使用整数值,要么创建自己的枚举。

根据定义,无法通过后期绑定访问预定义的enum。 显然,它们将显示为 .NET 的"整数"。当然,您可以将一些int强制转换为已定义的enumconst蚁,但此类代码仅供您使用,并不代表COM库通常发布的强协定。

真的无法通过后期绑定访问它们吗?如果是这样,为什么?我希望早期绑定是 IDE 左右使后期绑定代码变得容易。

早期绑定使用 COM 类型库或 COM 互操作库。 这些本质上是通过提供 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

后期绑定与否

此示例不是通过带有反射的后期绑定访问枚举吗?不同之处在于它仅适用于同一文件

也许,这是一种后期绑定的形式。我可能会使用"脱钩">一词。

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

a( 提前不知道您将与什么接口

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

c( 想要将应用与任何特定版本的 COM 库分离

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

  1. 你知道你正在处理 Excel
  2. 您可以访问"类型库"的形式 - 包含定义的表单。在这种情况下,枚举常量
  3. 你在某种程度上与Excel耦合

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

告诉我更多

  • C# 创建 Excel 工作表后期绑定

最新更新