使用Type.IsAssignableFrom(Type)时的程序集冲突

时间:2014-11-12 20:43:42

标签: c# reflection .net-assembly

我正在动态地将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。

如果可能的话,我想解决这个问题而不注入一些只提供类型的中间组件。

1 个答案:

答案 0 :(得分:0)

对好奇心的满意......

答案归结为在项目设计中做出小小的让步。而不是将接口类(代码页)链接到每个项目,并允许每个项目成为它自己的独立实体,我不得不在主EXE项目中引用该类。而不是将自己的链接合并到IMyInterface,各个DLL构成对该EXE项目的程序集引用。

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

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