1

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. WPFプロジェクト。
  2. 拡張プロジェクト。
  3. 契約プロジェクト。

拡張プロジェクトにはエクスポートが含まれています。コントラクトプロジェクトには、WPFプロジェクトと拡張プロジェクトで共有されるインターフェイスが含まれています。

[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を初めて使用し、コードの改善点にも感謝しています。

前もって感謝します。

4

1 に答える 1

0

最初に、同じソリューションに含まれる他のプロジェクトのパーツは、以下に示すコードスニペットによって自動的に識別されると思いました。

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

しかし、そうではありません。実行中のプロジェクトのbin / debugにdllを手動で配置する必要があります(これはデバッグモードで実行されているため)

または、プロジェクトのプロパティ=>ビルドイベント=>ポストビルドイベントのコマンドラインを次のように変更する必要があります。

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

これにより、必要なdllが実行中のビンに自動的にコピーされます。

または、プロジェクトのプロパティ=>ビルド=>出力パスで変更できます。出力パスを実行中のプロジェクトのデバッグフォルダーに設定できます。

于 2013-01-06T09:00:43.683 に答える