Я пробовал это некоторое время, и у меня есть некоторые проблемы. У меня есть проект, который динамически загружает 1 или более DLL, и я не могу заставить привязку вида работать.Caliburn Micro - View & viewmodel в отдельной DLL
Я переопределен метод SelectAssemblies как таковой:
protected override IEnumerable<Assembly> SelectAssemblies()
{
string[] AppFolders = Directory.GetDirectories(Config.AppsFolder);
List<Assembly> assemblies = new List<Assembly>();
assemblies.Add(Assembly.GetExecutingAssembly());
foreach (string f in AppFolders)
{
Assembly ass = Directory.GetFiles(f, "*.dll", SearchOption.AllDirectories).Select(Assembly.LoadFrom).SingleOrDefault();
if (ass != null)
{
assemblies.Add(ass);
}
}
Apps = assemblies;
return assemblies;
}
Это работает, как задумано, я тогда есть метод, который работает на нажатие кнопки, которая делает:
public void OpenApp(string appName)
{
//AppName should be the same as the dll.
string assName = string.Format("TabletApp.{0}", appName);
Assembly ass = AppBootstrapper.Apps.SingleOrDefault(x => x.GetAssemblyName() == assName);
if (ass != null)
{
dynamic vm = ass.CreateInstance(string.Format("TabletApp.{0}.ViewModels.{0}ViewModel", appName));
IoC.Get<IWindowManager>().ShowDialog(vm);
}
}
Это находит viewmodel fine, однако я получаю сообщение об ошибке «не удалось найти контракт для« ExampleView »при загрузке ExampleViewModel. Мне также пришлось добавить [Export (typeof (view)] для каждого вида в базовой сборке, так как я внес это изменения. Похоже, что Caliburn micro автоматически прекратил инициализацию просмотров.
Кто-нибудь знает, вы сделали не так?