3

WPFプロジェクトにPrism4とMEFを使用しています。ディレクトリからロードする必要のあるDLLがいくつかあります。これらのDLLはIGameを介してIModuleを実装適切に形成されます(または少なくとも私はそう思います):

[Module(ModuleName = "SnakeModule")]
class SnakeModule : IGame
{
    public void Initialize()
    {
        Console.WriteLine("test");
    }

    public void StartGame()
    {
        throw new NotImplementedException();
    }

}

現在、メインプロジェクトはコンパイル中ですが、モジュールは初期化されません。ブートストラッパーのセットアップ方法を理解するのに問題があり、 DirectoryModuleCatalogの完全な例がないため、ドキュメントはあまり役に立ちません。モジュール性クイックスタートもコンパイルされていません。これが私のブートストラッパーです:

class BootStrap : MefBootstrapper
    {

        protected override DependencyObject CreateShell()
        {
            return ServiceLocator.Current.GetInstance<Shell>();
        }

        protected override void InitializeShell()
        {
            Application.Current.MainWindow = (Window)this.Shell;
            Application.Current.MainWindow.Show();
        }

        protected override void ConfigureAggregateCatalog()
        {
            this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(BootStrap).Assembly));  
        }


        protected override IModuleCatalog CreateModuleCatalog()
        {

            DirectoryModuleCatalog catalog = new DirectoryModuleCatalog() { ModulePath = @"..\..\..\GameTestLib\bin\Debug" };
            return catalog;
        }

        protected override void ConfigureContainer()
        {
            base.ConfigureContainer();
        }

    }

DLLのパスは正しいです。要約すると、私の質問は次のとおりです。ブートストラッパーをどのように設定する必要がありますか?

4

1 に答える 1

4

まず、Prismを使用しているので、次のようにModuleExportを使用することをお勧めします。

[ModuleExport("SnakeModule", typeof(IGame))]

しかし、実際の問題は、クラスをパブリッククラスとして設定しなかったため、モジュールの検出が妨げられたことが原因です。したがって、コードを次のように変更する必要があります。

[ModuleExport("SnakeModule", typeof(IGame))]
public class SnakeModule : IGame
{
    public void Initialize()
    {
        Console.WriteLine("test");
    }

    public void StartGame()
    {
        throw new NotImplementedException();
    }

}

そしてそれは大丈夫なはずです!

于 2013-01-20T02:50:37.910 に答える