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

时间:2019-11-28 09:54:35

标签: c# .net dll enums late-binding

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

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

如果枚举位于不同的DLL中,则它们can't be accessed。因此,我use the integer values或创建了自己的枚举。

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

1 个答案:

答案 0 :(得分:1)

  

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

根据定义,不可能通过 late-binding 访问预定义的enum。显然,它们将在.NET中显示为“整数” 。当然,您可以将某些int投射到您已定义的enumconst蚂蚁上,但是这样的代码仅是为了您的利益,并不代表COM库通常发布的强合同

  

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

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

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

此外,术语 late binding 表示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

是否后期绑定

  

这个例子不是通过反射后期绑定访问一个枚举吗?区别在于它仅适用于同一文件

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

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

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

b)您确实知道,但是由于没有安装任何类型库或者开发人员从未创建它,所以您无权访问任何类型库

c)希望使您的应用与COM库的任何特定版本脱钩

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

  1. 您知道您正在使用Excel
  2. 您可以访问一种“类型库”形式-一种包含定义的形式。在这种情况下,枚举常量
  3. 您在某种程度上已经与Excel相结合

考虑到这一点,我不确定您为什么要遵循最新路线。您似乎正在采用更困难的方法。

告诉我更多