为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕容708150 2021-11-14 15:02:51
我有一个应用程序,我通过读取插件的 DLL 文件然后使用AppDomain.CurrentDomain.Load(bytes). 请注意,应用程序和插件加载在同一个 AppDomain 中。该插件包含几个类,它们使用静态构造函数在服务定位器系统中注册自己。后来,我的主应用程序尝试使用服务定位器查找并实例化这些服务类之一,但找不到该类。通过手动检查,我可以看到定位器中存在注册表项,因此它已注册,但由于某种未知原因,类型不相等。然后我在类型注册的地方放了一个断点,发现了以下奇怪的地方:怎么可能typeof(IViewFor<CompactDashboardViewModel>)不等于自己?然后我又测试了一些东西:t == ttruetypeof(IViewFor<CompactDashboardViewModel>) == typeof(IViewFor<CompactDashboardViewModel>)truet.AssemblyQualifiedName == typeof(IViewFor<CompactDashboardViewModel>).AssemblyQualifiedNametrue实际上,这两个 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,但到目前为止没有成功。
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超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>;


查看完整回答
反对 回复 2021-11-14
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

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

  1. 我的主应用程序引用了一个库项目,而该项目又引用了插件项目。这可能导致程序集在不同的加载上下文中加载两次(有关更多信息,请参见下面的链接)。我删除了参考。问题没有解决,现在发生了奇怪的事情,例如typeof(CompactDashboardViewModel) == null.

  2. 我的插件加载代码最初使用appdomain.Load(bytes). 我用Assembly.LoadFromtypeof()现在工作正常,并按预期工作。但是,Type.GetType()有时仍会返回 null。

  3. 我换成Assembly.LoadFromAssembly.Load,并使用添加我的插件目录探测路径<probing>的标签app.config。现在一切正常,但是我无法通过文件路径加载插件,因为Assembly.Load需要程序集名称。不理想,但我可以忍受。


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信