我试图找出如何使用C#通过COM互操作性访问Excel的枚举。
使用早期绑定很简单,但是使用后期绑定,我才发现我可以访问same file中的枚举。
如果枚举位于不同的DLL中,则它们can't be accessed。因此,我use the integer values或创建了自己的枚举。
真的不可能通过后期绑定访问它们吗?如果是这样,为什么?我希望早期绑定就是IDE左右使后期绑定代码变得容易的方法。
答案 0 :(得分:1)
如果枚举位于不同的DLL中,则无法访问它们。因此,我要么使用整数值,要么创建自己的枚举。
根据定义,不可能通过 late-binding 访问预定义的enum
。显然,它们将在.NET中显示为“整数” 。当然,您可以将某些int
投射到您已定义的enum
或const
蚂蚁上,但是这样的代码仅是为了您的利益,并不代表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);
的示例告诉我一些事情:
考虑到这一点,我不确定您为什么要遵循最新路线。您似乎正在采用更困难的方法。