MEF目录为空
本文关键字:MEF | 更新日期: 2023-09-27 17:50:45
我正在使用一个使用MEF的WPF应用程序。但是,即使我运行下面的代码(作为代码中某处的测试代码片段),目录始终是空的。所有的示例代码都做了同样的事情,这些都工作得很好。但是我的坏了。我错过了一些重要的东西,我自己也弄不清楚。所以,我需要一些帮助。
var catalog = new AggregateCatalog();
var x = Assembly.GetExecutingAssembly().Location;
catalog.Catalogs.Add(
new DirectoryCatalog(
Path.GetDirectoryName(
Assembly.GetExecutingAssembly().Location)));
CompositionContainer container = new CompositionContainer(catalog);
这是实际的场景代码。同一解决方案中有3个项目
- wpf Project. 扩展项目
- 。 合同项目
- 。
Extension项目包含Exports。合同项目包含wpf项目和Extension项目共享的接口。
[Export("LoginManager", typeof(IEmployeeLoginManager))]
public class LoginManager : IEmployeeLoginManager
{
public EmployeeLoginModel LoginEmployee(String userName, string password)
{
DEmployeeLoginManager employeeLoginManager = new DEmployeeLoginManager();
return employeeLoginManager.LoginEmployee(userName, password);
}
}
这个Export在WPF项目中使用如下,
public partial class LoginWindow
{
public EmployeeLoginModel LoggedInEmployee;
[Import("LoginManager",AllowDefault = true)]
private IEmployeeLoginManager LoginManager;
public LoginWindow()
{
InitializeComponent();
}
private void RadWindow_Closed_1(object sender, Telerik.Windows.Controls.WindowClosedEventArgs e)
{
Application.Current.Shutdown();
Environment.Exit(0);
return;
}
private void RadButton_Click_1(object sender, RoutedEventArgs e)
{
string passWord = PasswordText.Password;
LoggedInEmployee.Password = passWord;
var container = MEFLoader.GetMEFContainer();
container.ComposeParts(this);
EmployeeLoginModel employee= LoginManager.LoginEmployee(LoggedInEmployee.UserName, passWord);
if (employee.LoginStatus == true)
{
this.Close();
}
}
PS:这是MEFLoader类:
public static class MEFLoader
{
public static CompositionContainer GetMEFContainer()
{
var catalog = new AggregateCatalog(new DirectoryCatalog("."), new AssemblyCatalog(Assembly.GetExecutingAssembly()));
var container = new CompositionContainer(catalog);
return container as CompositionContainer;
}
}
我是MEF的新手,我也很欣赏我代码中的任何改进点。
首先,我认为在相同解决方案中的其他项目中的部分是由下面所示的代码片段自动识别的。
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(
new DirectoryCatalog(
Path.GetDirectoryName(
Assembly.GetExecutingAssembly().Location)));
CompositionContainer container = new CompositionContainer(catalog);
但它不是那样的,我们必须手动将DLL放在执行项目的bin/debug中(因为这是在调试模式下运行)
或者你需要做的是,你需要改变项目属性=> build events => post build event命令行到
copy $(TargetPath) $(SolutionDir)'[Your running application folder]'bin'Debug
这将自动复制必要的dll到执行的bin。
或者您可以在project properties=> build =>输出路径中更改它,您可以将输出路径设置为正在执行的项目的Debug文件夹