C# 为什么可以';是否可以通过后期绑定访问来自不同DLL的枚举?
我试图找出如何通过使用C#的COM互操作性访问Excel的枚举 使用早期绑定很简单,但使用后期绑定,我只发现我可以在中访问枚举 如果枚举位于不同的DLL中,则它们将被删除。因此,要么我创建自己的枚举,要么创建自己的枚举 真的不可能通过后期绑定访问它们吗?若然,原因为何?我认为早期绑定是IDE简化的后期绑定代码 如果枚举位于不同的DLL中,则无法访问它们。因此,要么使用整数值,要么创建自己的枚举 根据定义,不可能通过后期绑定访问预定义的C# 为什么可以';是否可以通过后期绑定访问来自不同DLL的枚举?,c#,.net,dll,enums,late-binding,C#,.net,Dll,Enums,Late Binding,我试图找出如何通过使用C#的COM互操作性访问Excel的枚举 使用早期绑定很简单,但使用后期绑定,我只发现我可以在中访问枚举 如果枚举位于不同的DLL中,则它们将被删除。因此,要么我创建自己的枚举,要么创建自己的枚举 真的不可能通过后期绑定访问它们吗?若然,原因为何?我认为早期绑定是IDE简化的后期绑定代码 如果枚举位于不同的DLL中,则无法访问它们。因此,要么使用整数值,要么创建自己的枚举 根据定义,不可能通过后期绑定访问预定义的enums。显然,它们将在.NET中显示为“整数”。当然,您可
enum
s。显然,它们将在.NET中显示为“整数”。当然,您可以将一些int
强制转换为您定义的enum
,或者可能是const
ant,但这样的代码只是为了您的利益,并不代表COM库通常发布的强大契约
真的不可能通过后期绑定访问它们吗?若然,原因为何?我认为早期绑定是IDE简化的后期绑定代码
早期绑定使用COM类型库或COM互操作库。这些基本上是围绕COM类型的.NET包装,提供了C#或VB.NET熟悉的类型。有了它,你可以以语句完成的形式获得智能感知;参数帮助;方法和帮助。编译器将帮助您解决编译时可能出现的任何错误。早期绑定仅在存在类型库或COM互操作库时有效
后期绑定不会以智能感知的形式提供任何信息。没有迹象表明有哪些物品可用;目前有哪些方法;也不知道要传递什么参数。您的代码可能会编译,但仍可能出现运行时错误。后期绑定不使用也不需要类型库或COM互操作库
此外,术语延迟绑定对COM来说意味着非常特殊的东西。它通常涉及调用IDispatch
,以获取方法名列表。我不确定.NET的enumType.GetField(“Bar”).GetValue()
是否符合条件
后期绑定示例
后期绑定C#代码:
是否迟订
这个例子不是通过与反射的后期绑定来访问枚举吗?区别在于它只适用于同一个文件
也许,这是后期装订的一种形式。我可能会使用解耦这个术语
COM世界中的后期绑定通常用于以下一个或多个场景:
a) 不知道您将提前与什么进行交互
b) 您知道,但是您没有访问任何类型库的权限,因为它没有安装,或者开发人员从未创建过它
c) 要将应用程序与任何特定版本的COM库分离吗
您提供的示例使用enumType.GetField(“Bar”).GetValue(null)代码>告诉我一些事情:
您知道您正在处理Excel
您可以访问一种形式的“类型库”——一种包含定义的类型库。在本例中,枚举常量
您在某种程度上与Excel结合在一起
考虑到这一点,我不知道你为什么要走晚行路线。你似乎采取了更强硬的方法
告诉我更多
不是通过与反射的后期绑定来访问枚举吗?区别在于它只适用于同一个文件。@user7393973请参见最后一段。另外,我不确定为什么多个文件会成为一个问题
// 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