【问题标题】:Why can't enumerations from different DLLs be accessed through late binding?为什么不能通过后期绑定访问来自不同 DLL 的枚举?
【发布时间】:2019-11-28 09:54:35
【问题描述】:

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

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

如果枚举位于不同的 DLL 中,则为 can't be accessed。所以要么我use the integer values 要么创建我自己的枚举。

真的不能通过后期绑定来访问吗?如果是这样,为什么?我希望早期绑定是由 IDE 左右简化的后期绑定代码。

【问题讨论】:

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


    【解决方案1】:

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

    根据定义,不可能通过后期绑定访问预定义的enums。显然,它们将在 .NET 中显示为 “整数”。当然,您可以将一些 int 转换为您已定义的 enumconstant,但这样的代码只是为了您的利益,并不代表 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 有点耦合

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

    告诉我更多

    【讨论】:

    • this example 不是通过反射后期绑定访问enum 吗?不同之处在于它只适用于同一个文件。
    • @user7393973 见最后一段。另外,我不确定为什么多个文件会成为问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多