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

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

后来,我的主应用程序尝试使用服务定位器查找并实例化这些服务类之一,但找不到该类。通过手动检查,我可以看到定位器中存在注册表项,因此它已注册,但由于某种未知原因,类型不相等。

然后我在类型注册的地方放了一个断点,发现了以下奇怪的地方:

http://img2.mukewang.com/6190b4c00001bde705790148.jpg

怎么可能typeof(IViewFor<CompactDashboardViewModel>)不等于自己?


然后我又测试了一些东西:


t == t

true

typeof(IViewFor<CompactDashboardViewModel>) == typeof(IViewFor<CompactDashboardViewModel>)

true

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

true

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


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,但到目前为止没有成功。


慕容708150
浏览 170回答 2
2回答

湖上湖

也许这有效: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编辑:阅读这篇文章类型检查后:typeof、GetType 还是?我希望这能奏效:Type t = typeof(IViewFor<CompactDashboardViewModel>);//this should evaluate to true:bool result = t is IViewFor<CompactDashboardViewModel>;

潇潇雨雨

好的,所以我解决了这个问题。这是我所做的:我的主应用程序引用了一个库项目,而该项目又引用了插件项目。这可能导致程序集在不同的加载上下文中加载两次(有关更多信息,请参见下面的链接)。我删除了参考。问题没有解决,现在发生了奇怪的事情,例如typeof(CompactDashboardViewModel) == null.我的插件加载代码最初使用appdomain.Load(bytes).&nbsp;我用Assembly.LoadFrom.&nbsp;typeof()现在工作正常,并按预期工作。但是,Type.GetType()有时仍会返回 null。我换成Assembly.LoadFrom用Assembly.Load,并使用添加我的插件目录探测路径<probing>的标签app.config。现在一切正常,但是我无法通过文件路径加载插件,因为Assembly.Load需要程序集名称。不理想,但我可以忍受。
打开App,查看更多内容
随时随地看视频慕课网APP