Pro*_*ofK 6 reflection wpf prism mef mvvm
我有一节课:
public abstract class XTimeViewModel : DevExpress.Xpf.Mvvm.ViewModelBase
{
public bool PropertiesChanged { get; set; }
[NotifyPropertyChangedInvocator]
protected virtual void _onPropertyChanged(/*[CallerMemberName]*/ string propertyName = null)
{
PropertiesChanged = true;
RaisePropertyChanged(propertyName);
}
}
Run Code Online (Sandbox Code Playgroud)
它包含在一个名为的程序集中Common.当我尝试添加一个DirectoryCatalog包含Common和其他程序集的文件夹,以及依赖项,如DevExpress.Xpf.Mvvm.v13.2:
var catalog = new DirectoryCatalog(unitPath, "*.dll");
AggregateCatalog.Catalogs.Add(catalog);
Run Code Online (Sandbox Code Playgroud)
我得到了ReflectionTypeLoadException一个TypeLoadException陈述:
"无法从程序集'G4S.XTime.Common,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'加载类型'Startup.ViewModels.ViewModel'."
我不明白为什么MEF无法加载这种类型.当我尝试示例代码时:
var asm = Assembly.LoadFrom(@"C:\Development\XTime\Startup\Units\G4S.XTime.Common.dll");
var vm = asm.GetType("G4S.XTime.Common.XTimeViewModel");
Run Code Online (Sandbox Code Playgroud)
然后vm包含正确的类型,即G4S.XTime.Common.XTimeViewModel.
只是一个预感,但我所加载的模块都没有Initialize调用,我认为这个错误接近其根本原因.
如果我引用模块,并用于AssemblyCatalog加载它们,那么根本没有问题,所有工作都应该如此.什么可以将程序集移出以在运行时加载更改以阻止工作?
BTW,Common不是一个模块本身,而只是几个模块的依赖.
最有可能的是,您的 dll 与启动 exe 不在同一位置。如果它们被 exe 直接引用(默认情况下,引用的 dll 被复制到输出目录),则它们是。
既然您提到没有调用 Initialize() 方法,也许您正在使用 Prism?如果是这样,请进入引导程序的每个步骤以查看目录是否正确(即您认为应该在其中的所有类型实际上都在其中)。
您没有显示所讨论的 ViewModel 也被标记为 [Export],因此请确保它在那里并在其构造函数中放置一个断点,以确保它在目录创建完成后实际上被实例化(即当您正在创建虚拟机附加到的视图)。
尝试向我们提供完整的异常跟踪,以了解到底发生了什么...有时,根源就隐藏在这些类型加载异常中。
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |