我正在尝试将一些项目带到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有很好的了解,并且可以对此发表评论,或者指出对更改的更详尽的概述,那将非常有用。
答案 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团队为何更改此方法的人随时欢迎发表评论。