【问题标题】:How can you cast objects from different assemblies into each other?如何将不同组件中的对象相互转换?
【发布时间】:2009-04-01 22:10:21
【问题描述】:

我遇到了这个显然并不罕见的问题 --

  1. 我在Assembly A中有一个接口。

  2. 我正在动态加载程序集 B,并尝试将其中的对象从程序集 A 投射到我的界面中。

  3. 失败并出现 InvalidCastException。

我开始明白为什么 - 程序集 A 中的一个类和程序集 B 中的一个类,即使具有相同的名称和相同的代码,也不是同一个东西,不能相互转换。

我的问题是:有解决办法吗?有什么办法可以使这两种类型兼容,还是我需要在程序集 B 中复制我的接口并将对象转换为那个?

我正在使用 Assembly.LoadFrom 加载程序集 B - 是否有其他方法可以使它们类型兼容?

我不可能是第一个遇到这个问题的人。我正在尝试做的似乎是插件架构中相当常见的任务。

【问题讨论】:

    标签: .net assemblies


    【解决方案1】:

    复制不是答案。程序集 B 是否可以引用程序集 A 并从那里使用接口(或其他)?

    如果没有,请在程序集 A 和程序集 B 都引用的独立 dll 中声明接口(或其他)。那么界面只有1个版本,一切正常。

    【讨论】:

      【解决方案2】:

      您绝对可以从一个程序集中的类型转换为另一个程序集中的类型 - 否则我们永远无法从 object 向下转换:)

      我怀疑问题在于接口已单独加载 - 我怀疑您的程序集 B 再次加载了程序集 A(可能从其他地方?)。

      您的文件布局是什么样的?如果您从不同的目录加载程序集 B,并且它的目录中有程序集 A 的副本,则可能是从那里加载它。程序集加载和绑定是一项棘手的工作。我建议获取“CL​​R via C#”并非常仔细地阅读有关它的章节,和/或turning on Fusion logging 看看发生了什么。

      (顺便说一句,我假设程序集 B 中的类型确实确实实现了程序集 A 中的接口?如果没有,那就可以解释了!)

      顺便说一句,我有一个fairly old article,它可以作为一个教程。它可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-20
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 2021-09-24
        相关资源
        最近更新 更多