gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:09:48 27 4
gpt4 key购买 nike

我有一个类:

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);
}
}

它包含在一个名为 Common 的程序集中。 .当我尝试添加 DirectoryCatalog对于包含 Common 的文件夹和其他程序集以及依赖项,例如 DevExpress.Xpf.Mvvm.v13.2 :
var catalog = new DirectoryCatalog(unitPath, "*.dll");
AggregateCatalog.Catalogs.Add(catalog);

我得到一个 ReflectionTypeLoadException , 带有 TypeLoadException说明:

"Could not load type 'Startup.ViewModels.ViewModel' from assembly 'G4S.XTime.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'."



我不明白为什么 MEF 不能加载这种类型。当我尝试示例代码时:
var asm = Assembly.LoadFrom(@"C:\Development\XTime\Startup\Units\G4S.XTime.Common.dll");
var vm = asm.GetType("G4S.XTime.Common.XTimeViewModel");

然后 vm包含正确的类型,即 G4S.XTime.Common.XTimeViewModel .

只是预感,但我加载的模块都没有 Initialize调用,我认为这个错误接近根本原因。

如果我引用模块并使用 AssemblyCatalog加载它们,完全没有问题,一切正常。什么可以将程序集移出以在运行时加载以阻止工作?

顺便说一句, Common不是模块本身,而只是几个模块的依赖关系。

最佳答案

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

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

您没有显示有问题的 ViewModel 也被标记为 [Export],因此请确保它存在并在其 ctor 中放置一个断点以确保它在目录创建完成后实际被实例化(即当您正在创建 VM 附加到的 View )。

尝试给我们完整的异常跟踪,看看到底发生了什么……有时根隐藏在那些类型加载异常中。

关于wpf - 什么可以阻止 MEF 或 Prism 加载我的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23381362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com