反射:使用typeof()或IsAssignableFrom()检查类实现的接口时的不同行为

Lea*_*ner 0 .net c# reflection typeof

我有两个接口IConfigurationManagerILocator在同一个程序集中定义(让我们称之为程序集"A")和相同的命名空间.

有一个名为"B"的启动项目,它对程序集"A"有"项目引用".

程序集A也包含两个接口的具体实现.我在程序集A上有一个"post-build事件",它将DLL复制到"B"项目的'bin\debug'文件夹,当我从visual studio 2012运行它时运行应用程序.

在app.config文件中,我提到了当我想要两个接口的具体实现时要使用的程序集和类型.(我需要在运行时解析类型映射,并且将在不同的程序集中具有接口和实现,而我根本没有开发它们.)

在我的代码中,我Assembly.LoadFile()从启动项目的'bin\debug \'文件夹中加载程序集A(使用).然后我遍历所有类型并ILocator使用以下代码检查类是否是类型:

if(type.GetInterfaces.Contains(typeof(IConfigurationManager))
Run Code Online (Sandbox Code Playgroud)

这返回FALSE,但另一方面,ILocator返回TRUE的类似代码.为什么会这样?我也尝试过使用IsAsseignableFrom(),但结果相同.

为什么一个调用成功而另一个调用失败时,所有内容(如声明接口的程序集,加载了哪个类型的程序集等)在检查类实现的接口时是否相同?

注意:我知道Unity容器等.但我仍然有与使用反射进行类型检查相关的相同问题.

Ant*_*hyy 5

可能是因为"其他一切"不一样.由于你的B项目有一个项目引用A,它最终加载A两次:首先是CLR,当B使用ILocatorA中的类型,然后当你明确加载A时LoadFile.因为LoadFile将程序集加载到不同的绑定上下文中,所以在应用程序域中获得A的两个副本,其中两组类型(令人困惑地)具有相同的FullName等但仍然不同.您可以通过比较from (或者就此而言)中的Assembly对象来检查这一点.IConfigurationManagertype.GetInterfaces ()typetypeof (IConfigurationManager)