如何将不同组件中的对象相互转换?

时间:2009-04-01 22:10:22

标签: .net assemblies

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

  1. 我在程序集A中有一个界面。

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

  3. InvalidCastException失败。

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

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

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

    我不能成为第一个遇到这个问题的人。我想要做的事情似乎是插件架构相当普遍的任务。

2 个答案:

答案 0 :(得分:6)

复制不是答案。装配B可以参考装配A并从那里使用接口(或其他)吗?

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

答案 1 :(得分:2)

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

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

您的文件布局是什么样的?如果您从另一个目录加载程序集B,并且在其目录中有一个程序集A的副本,则可能从那里加载它。装配和装订是一项棘手的工作。我建议抓住“通过C#CLR”并仔细阅读其中的章节,和/或turning on Fusion logging看看发生了什么。

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

顺便说一下,我有一个fairly old article作为一种教程。这可能有所帮助。