我有一个应用程序,在其中我通过读取插件的DLL文件来加载插件,然后使用AppDomain.CurrentDomain.Load(bytes)
加载字节。请注意,该应用程序和插件已加载到同一AppDomain中。该插件包含几个类,这些类使用静态构造函数在服务定位器系统中注册自己。
稍后,我的主应用程序尝试使用服务定位器查找并实例化这些服务类之一,但找不到该类。手动检查后,我发现定位器中存在注册表项,因此已进行了注册,但由于某些未知原因,类型不相等。
然后我在类型注册的地方放置一个断点,发现以下奇怪之处:</ p>
typeof(IViewFor<CompactDashboardViewModel>)
如何不等于自身?
然后我又测试了几件事:
t == t
true
typeof(IViewFor<CompactDashboardViewModel>) == typeof(IViewFor<CompactDashboardViewModel>)
true
t.AssemblyQualifiedName == typeof(IViewFor<CompactDashboardViewModel>).AssemblyQualifiedName
true
实际上,除了m_handle
和m_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,但到目前为止仍未成功。
答案 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)
好的,所以我解决了这个问题。这是我所做的:
typeof(CompactDashboardViewModel) == null
之类的奇怪事件。appdomain.Load(bytes)
。我将其替换为Assembly.LoadFrom
。 typeof()
现在可以正常工作,并且可以正常工作。但是,Type.GetType()
有时仍返回null。 Assembly.LoadFrom
替换为Assembly.Load
,并使用<probing>
中的app.config
标签将插件目录添加到了探测路径。现在一切正常,但是我无法按文件路径加载插件,因为Assembly.Load
需要程序集名称。不理想,但是我可以忍受。有用的资料来源: