8

を実装するクラスがいくつかありますIDessertPlugin。これらは、MEFを使用してそれらのインスタンスを起動し、アプリケーションのプラグイン機能として使用するさまざまなDLLに含まれています。

だから私がやりたいのは、MEFを使用してプラグインをロードしたDLLのバージョン番号を表示することです。1つ以上のプラグインは、アプリケーションにロードする1つ以上のDLLで定義されています。

今、私はそのようなことをします:

var catalog = new AggregateCatalog();
catalog.Catalogs.Add(
   new DirectoryCatalog(Path.Combine(
      Path.GetDirectoryName(Assembly.GetExecutingAssembly().location), "Plugins")));

var container = new CompositionContainer(catalog);

container.ComposeParts(this);

そして、それは私のアプリケーションが実行されているPluginsサブディレクトリからプラグインをうまくロードします。

のようなことをする

catalog.Catalogs.First().Parts.First().GetType().Assembly.FullName

「System.ComponentModel.Composition、Version = 4.0.0.0、...」を返すだけです。

私が知りたいと思っていたのは、CakePlugins.dllのバージョン1.0とIceCreamPlugins.dllのバージョン1.1を持っているということでした。プラグイン自体にはバージョン属性がありません。DLLのバージョンに依存したいと思います。それが理にかなっていることを願っています。

そこで使用しているDLLを把握していないので、Assembly.GetName().Versionそれらを呼び出すことができます。

アイデア?


解決:

したがって、パーツが構成された後の私の問題の解決策は非常に簡単でした。

私のプラグイン管理コードには、次のようなエントリがあります。

[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;

コンテナパーツの構成が完了すると、次のようにプラグインを反復処理できます。

foreach(var plugin in dessertPlugins)
{
   Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}
4

2 に答える 2

2

AssemblyVersionさまざまなプロパティ、、AssemblyFileVersionおよびからアセンブリ情報を取得できますAssemblyDescription

                /// <summary>
                /// This class provide inforamtion about product version.
                /// </summary>
                public class ProductVersion
                {
                    private readonly FileVersionInfo fileVersionInfo;

                    private readonly AssemblyName assemblyName;


                    private ProductVersion(Type type)
                    {
                        // it done this way to prevent situation 
                        // when site has limited permissions to work with assemblies.
                        var assembly = Assembly.GetAssembly(type);
                        fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
                        assemblyName = new AssemblyName(assembly.FullName);
                    }

                    public string AssemblyFileVersion
                    {
                        get
                        {
                            return fileVersionInfo.FileVersion;
                        }
                    }

                    public string AssemblyVersion
                    {
                        get
                        {
                            return assemblyName.Version.ToString();
                        }
                    }



                }
于 2012-08-07T15:07:35.370 に答える
1

したがって、パーツが構成された後の私の問題の解決策は非常に簡単でした。ロードしたすべてのプラグインを保持するコンテナーを調べるのではなく、MEFオブジェクト自体を掘り下げようとしていました。答えは、これらのプラグインがどのようにロードされているかという事実を完全に無視し、インスタンス化されたオブジェクト自体を確認することでした。

私のプラグイン管理コードには、次のようなエントリがあります。

[ImportMany(typeof(IDessertPlugin)]
private IEnumerable<IDessertPluing> dessertPlugins;

コンテナパーツの構成が完了すると、次のようにプラグインを反復処理できます。

foreach(var plugin in dessertPlugins)
{
   Console.WriteLine(Assembly.GetAssembly(plugin.GetType()).GetName().Version.ToString());
}
于 2012-08-07T15:47:18.993 に答える