为什么这些Type对象不相等?

时间:2018-08-03 12:45:08

标签: c# .net types

我有一个应用程序,在其中我通过读取插件的DLL文件来加载插件,然后使用AppDomain.CurrentDomain.Load(bytes)加载字节。请注意,该应用程序和插件已加载到同一AppDomain中。该插件包含几个类,这些类使用静态构造函数在服务定位器系统中注册自己。

稍后,我的主应用程序尝试使用服务定位器查找并实例化这些服务类之一,但找不到该类。手动检查后,我发现定位器中存在注册表项,因此已进行了注册,但由于某些未知原因,类型不相等。

然后我在类型注册的地方放置一个断点,发现以下奇怪之处:<​​/ p>

Screenshot from in debugging

typeof(IViewFor<CompactDashboardViewModel>)如何不等于自身?

然后我又测试了几件事:

t == t
true
typeof(IViewFor<CompactDashboardViewModel>) == typeof(IViewFor<CompactDashboardViewModel>)
true
t.AssemblyQualifiedName == typeof(IViewFor<CompactDashboardViewModel>).AssemblyQualifiedName
true

实际上,除了m_handlem_cache字段以外,这两个Type对象的所有内容似乎都是相等的。

typeof(IViewFor<CompactDashboardViewModel>).TypeHandle
{System.RuntimeTypeHandle}
    Value: 0x08690784
    m_type: {Name = "IViewFor`1" FullName = "ReactiveUI.IViewFor`1[[PluginMTSICS.ViewModel.CompactDashboardViewModel, PluginMTSICS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"}
t.TypeHandle
{System.RuntimeTypeHandle}
    Value: 0x0f8cf5a8
    m_type: {Name = "IViewFor`1" FullName = "ReactiveUI.IViewFor`1[[PluginMTSICS.ViewModel.CompactDashboardViewModel, PluginMTSICS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"}

有人知道这里发生了什么吗?我正在使用.NET 4.7.1。 我正在尝试创建MCVE,但到目前为止仍未成功。

2 个答案:

答案 0 :(得分:0)

也许可行:

Type t = typeof(IViewFor<CompactDashboardViewModel>);
//this should evaluate to true:
bool result = t.Equals(typeof(IViewFor<CompactDashboardViewModel>));

Type.Equals文档: https://msdn.microsoft.com/en-us/library/3ahwab82(v=vs.110).aspx

编辑:

在阅读了这篇文章Type Checking: typeof, GetType, or is?之后,我希望它会起作用:

Type t = typeof(IViewFor<CompactDashboardViewModel>);
//this should evaluate to true:
bool result = t is IViewFor<CompactDashboardViewModel>;

答案 1 :(得分:0)

好的,所以我解决了这个问题。这是我所做的:

  1. 我的主应用程序引用了一个库项目,该库项目又引用了插件项目。这可能导致程序集在不同的加载上下文中加载了两次(有关更多信息,请参见下面的链接)。我删除了参考。问题尚未解决,现在发生了诸如typeof(CompactDashboardViewModel) == null之类的奇怪事件。
  2. 我的插件加载代码最初使用appdomain.Load(bytes)。我将其替换为Assembly.LoadFromtypeof()现在可以正常工作,并且可以正常工作。但是,Type.GetType()有时仍返回null。
  3. 我将Assembly.LoadFrom替换为Assembly.Load,并使用<probing>中的app.config标签将插件目录添加到了探测路径。现在一切正常,但是我无法按文件路径加载插件,因为Assembly.Load需要程序集名称。不理想,但是我可以忍受。

有用的资料来源: