什么可以阻止MEF或Prism加载我的类型?

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不是一个模块本身,而只是几个模块的依赖.

out*_*red 0

最有可能的是,您的 dll 与启动 exe 不在同一位置。如果它们被 exe 直接引用(默认情况下,引用的 dll 被复制到输出目录),则它们是。

既然您提到没有调用 Initialize() 方法,也许您正在使用 Prism?如果是这样,请进入引导程序的每个步骤以查看目录是否正确(即您认为应该在其中的所有类型实际上都在其中)。

您没有显示所讨论的 ViewModel 也被标记为 [Export],因此请确保它在那里并在其构造函数中放置一个断点,以确保它在目录创建完成后实际上被实例化(即当您正在创建虚拟机附加到的视图)。

尝试向我们提供完整的异常跟踪,以了解到底发生了什么...有时,根源就隐藏在这些类型加载异常中。