我正在动态地将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。
如果可能的话,我想解决这个问题而不注入一些只提供类型的中间组件。
答案 0 :(得分:0)
对好奇心的满意......
答案归结为在项目设计中做出小小的让步。而不是将接口类(代码页)链接到每个项目,并允许每个项目成为它自己的独立实体,我不得不在主EXE项目中引用该类。而不是将自己的链接合并到IMyInterface
,各个DLL构成对该EXE项目的程序集引用。
这解决了EXE类型和加载的DLL类型之间的不兼容问题。
我说"小小的让步"因为设计总是在EXE的工作目录中有一个DLL,它将在运行时加载,因此项目引用在哲学上没有任何改变。