Caliburn.Micro 1.5.2到2.0.0突破了BootstrapperBase的变化

时间:2014-08-08 11:47:03

标签: c# mvvm caliburn.micro

我正在尝试将一些项目带到Caliburn Micro 2.0.0(CB.M),我看到我的代码与bootstrapping相关的无声失败。

这是因为我需要在引导程序中获取应用程序的可执行程序集。

更一般地说,我注意到例如尝试按照here所述编写MEFBoottrapper,调用AssemblySource.Instance将在1.x和2.0版本的CB.M之间产生不同的结果

使用CB.M 1.5.2,AssemblySource.Instance将包含正在执行的程序集。

使用CB.M 2.0.0,AssemblySource.Instance将包含定义自定义引导程序的程序集(它在与启动项目不同的项目中定义),因此是一个dll。

从1.5.2升级到2.0.0的迁移指南here on the CB.M homepage提到了一些更明显的突破性变化,但与上述内容无关。

如果有人对CB.M有很好的了解,并且可以对此发表评论,或者指出对更改的更详尽的概述,那将非常有用。

1 个答案:

答案 0 :(得分:1)

在仔细比较1.x和2.0源后,我发现了方法:

protected virtual IEnumerable<Assembly> SelectAssemblies()

BootstrapperBase

已经发生了一些变化。

// Decompiled with JetBrains decompiler
// Type: Caliburn.Micro.BootstrapperBase
// Assembly: Caliburn.Micro, Version=1.5.2.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f
// MVID: DC6F950D-BBB2-4CAB-9754-D5C81FE2659F
// Assembly location: ..\bin\Debug\Caliburn.Micro.dll
if (Execute.InDesignMode)
  {
    AppDomain currentDomain = AppDomain.CurrentDomain;
    Assembly assembly = Enumerable.LastOrDefault<Assembly>((IEnumerable<Assembly>) (currentDomain.GetType().GetMethod("GetAssemblies").Invoke((object) currentDomain, (object[]) null) as Assembly[] ?? new Assembly[0]), new Func<Assembly, bool>(BootstrapperBase.ContainsApplicationClass));
    if (assembly == (Assembly) null)
      return (IEnumerable<Assembly>) new Assembly[0];
    return (IEnumerable<Assembly>) new Assembly[1]
    {
      assembly
    };
  }
  else
  {
    Assembly entryAssembly = Assembly.GetEntryAssembly();
    if (entryAssembly == (Assembly) null)
      return (IEnumerable<Assembly>) new Assembly[0];
    return (IEnumerable<Assembly>) new Assembly[1]
    {
      entryAssembly
    };
  }

而2.0(Bootstrapper.cs):

    /// <summary>
    /// Inherit from this class in order to customize the configuration of the framework.
    /// </summary>
    public abstract class BootstrapperBase {

    ... left out for brevity

    /// <summary>
    /// Override to tell the framework where to find assemblies to inspect for views, etc.
    /// </summary>
    /// <returns>A list of assemblies to inspect.</returns>
    protected virtual IEnumerable<Assembly> SelectAssemblies() {
        return new[] { GetType().Assembly };
    }

我遇到过这个问题,因为我依靠SelectAssemblies()的能力将可执行程序集返回给我以供下游使用。

我可以通过覆盖这样解决问题(对于我的目的,我需要exe程序集):

protected override IEnumerable<System.Reflection.Assembly> SelectAssemblies()
{
    return new[] { Assembly.GetEntryAssembly() };
}

有兴趣了解CB.M团队为何更改此方法的人随时欢迎发表评论。