【发布时间】: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为空? -
并且您确定宿主应用程序引用的程序集版本与包含
IMyInterface和mydynamic.dll的程序集版本相同
标签: c# reflection .net-assembly