C# 为什么可以';是否可以通过后期绑定访问来自不同DLL的枚举?

C# 为什么可以';是否可以通过后期绑定访问来自不同DLL的枚举?,c#,.net,dll,enums,late-binding,C#,.net,Dll,Enums,Late Binding,我试图找出如何通过使用C#的COM互操作性访问Excel的枚举 使用早期绑定很简单,但使用后期绑定,我只发现我可以在中访问枚举 如果枚举位于不同的DLL中,则它们将被删除。因此,要么我创建自己的枚举,要么创建自己的枚举 真的不可能通过后期绑定访问它们吗?若然,原因为何?我认为早期绑定是IDE简化的后期绑定代码 如果枚举位于不同的DLL中,则无法访问它们。因此,要么使用整数值,要么创建自己的枚举 根据定义,不可能通过后期绑定访问预定义的enums。显然,它们将在.NET中显示为“整数”。当然,您可

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

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

如果枚举位于不同的DLL中,则它们将被删除。因此,要么我创建自己的枚举,要么创建自己的枚举

真的不可能通过后期绑定访问它们吗?若然,原因为何?我认为早期绑定是IDE简化的后期绑定代码

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

根据定义,不可能通过后期绑定访问预定义的
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