【问题标题】:Assembly conflict when using Type.IsAssignableFrom(Type)使用 Type.IsAssignableFrom(Type) 时的程序集冲突
【发布时间】:2014-11-12 20:43:42
【问题描述】:

我正在将 DLL 动态加载到 Assembly 中。我的问题是当我尝试使用 System.Reflection 从加载的程序集中获取某种类型时,我想用它来创建该类型的实例。我想要的类型恰好是一个接口。

这是基于我过去成功使用的代码,但是对于一个新项目,它失败了。问题似乎是被比较的类型来自两个不同的程序集。

代码如下:

IMyInterface _classInstance;

String path = Path.Combine(Application.StartupPath, "mydynamic.dll");
if (File.Exists(path))
{
   Byte[] ba = File.ReadAllBytes(path);
   if (ba.Length > 0)
   {
      Assembly dll = Assembly.Load(ba);
      if (dll != null)
      {
         foreach (Type T in dll.GetTypes())
         {
            if (typeof(IMyInterface).IsAssignableFrom(T))
               _classInstance = (IMyInterface)Activator.CreateInstance(T);
         }
      }
   }
}

使用来自this question 的建议,我能够确定typeof(IMyInterface).Module.FullyQualifiedName 返回正在执行的应用程序(我正在调试的EXE)。当然,这与我看到的 T.Module.FullyQualifiedName 不匹配,即 DLL。

如果可能的话,我想在不注入一些只提供类型之外什么都不做的中间程序集的情况下解决这个问题。

【问题讨论】:

  • 也许我误读了你的问题,但你不能创建接口的实例 - 只有实现这些接口的类的实例。
  • @xxbbcc 在这种情况下,它会起作用,因为通过测试的类型将是实现接口的类型,从而使转换适当。
  • 啊,好的,我现在在你的代码中看到了。我根据代码示例上方的文字进行了评论。 :)
  • 在代码执行后您是否遇到运行时异常或_classInstance 为空?
  • 并且您确定宿主应用程序引用的程序集版本与包含 IMyInterfacemydynamic.dll 的程序集版本相同

标签: c# reflection .net-assembly


【解决方案1】:

满足好奇心......

答案归结为在项目设计上做出一点小小的让步。我不必将接口类(代码页)链接到每个项目,并允许每个项目成为其自己的独立实体,我只需要在主 EXE 项目中引用该类。各个 DLL 并没有将自己的链接合并到 IMyInterface ,而是对该 EXE 项目进行程序集引用。

这解决了EXE的类型和加载的DLL类型不兼容的问题。

我说“小让步”是因为设计总是在 EXE 的工作目录中有一个 DLL,该 DLL 将在运行时加载,因此项目引用在哲学上没有任何改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多