MEF目录为空

时间:2013-01-06 07:25:25

标签: c# wpf mef

我正在使用一个使用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个项目。

  1. W PF Project。
  2. 扩建项目。
  3. 合同项目。
  4. 扩展项目包含导出。合同项目包含W PF项目和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);
        }
    }
    

    此导出在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的新手,我也很欣赏我的代码中的任何改进点。

    提前感谢。

1 个答案:

答案 0 :(得分:0)

首先,我认为同一解决方案中的其他项目中的部分会通过下面的代码段自动识别。

 var catalog = new AggregateCatalog();         
catalog.Catalogs.Add(
new DirectoryCatalog(
          Path.GetDirectoryName(
          Assembly.GetExecutingAssembly().Location)));
CompositionContainer container = new CompositionContainer(catalog);

但不是这样,我们必须手动将dll放在执行项目bin / debug中(因为它在调试模式下运行)

或者你要做的是,你必须改变项目属性=> build events =>将构建的事件命令行发布到

copy $(TargetPath) $(SolutionDir)\[Your running application folder]\bin\Debug

这将自动将必要的dll复制到执行的bin。

或者您可以在项目属性中更改它=> build =>输出路径,您可以设置执行项目的Debug文件夹的输出路径。