【MEF】CatalogExportProvider使ってみる。
- 2010.05.20 Thursday
- 23:12
JUGEMテーマ:コンピュータ
ExportProviderを継承するクラスがいっぱいあるみたいですが、そのひとつを使ってみました。
名前空間: System.ComponentModel.Composition.Hosting
アセンブリ: System.ComponentModel.Composition (System.ComponentModel.Composition.dll 内)
SourceProvider プロパティに何もいれずに実行したら、ちゃんと入れろって例外がとんできました。とても親切で感動しますね。
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
ExportProviderを継承するクラスがいっぱいあるみたいですが、そのひとつを使ってみました。
CatalogExportProviderクラス
指定したカタログで宣言されたすべての Export オブジェクトへのアクセスを提供します。
アセンブリ: System.ComponentModel.Composition (System.ComponentModel.Composition.dll 内)
SourceProvider プロパティに何もいれずに実行したら、ちゃんと入れろって例外がとんできました。とても親切で感動しますね。
using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace MEFSample
{
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(A) }))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] {typeof (B)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
{
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(A) }))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] {typeof (B)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
public interface IA
{
void Say();
}
{
void Say();
}
public interface IB
{
void Say();
}
{
void Say();
}
[Export(typeof(IA))]
class A : IA
{
[Import]
public IB B { get; set; }
class A : IA
{
[Import]
public IB B { get; set; }
public void Say()
{
B.Say();
}
}
{
B.Say();
}
}
[Export(typeof(IB))]
class B : IB
{
public void Say()
{
Console.WriteLine("B Say");
}
}
}
CatalogExportProviderオブジェクトとCompositionContainerオブジェクトで別々に指定したパーツがめでたく合成されました。
実行結果は
-------------------
B Say
上記を下記のようにAとBをひっくり返すと合成に失敗します。
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(B) }))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] {typeof (A)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
System.ComponentModel.Composition.ImportCardinalityMismatchException はハンドルされませんでした。
Message=制約 '((exportDefinition.ContractName == "MEFSample.IA") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "MEFSample.IA".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))' に一致する有効なエクスポートが見つかりませんでした。無効なエクスポートが拒否されている可能性があります。
Source=System.ComponentModel.Composition
StackTrace:
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportsCore(Type type, Type metadataViewType, String contractName, ImportCardinality cardinality)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValueCore[T](String contractName, ImportCardinality cardinality)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T](String contractName)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T]()
場所 MEFSample.Program.Main(String[] args) 場所 c:¥users¥art55¥documents¥visual studio 2010¥Projects¥MEFSample¥MEFSample¥Program.cs:行 17
場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()
InnerException:
まあこんな使い方はしないですね・・・。たぶん。
----
追記)
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new Type[0]))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] { typeof(A), typeof (B)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
これもダメでした・・・・うん??
class B : IB
{
public void Say()
{
Console.WriteLine("B Say");
}
}
}
CatalogExportProviderオブジェクトとCompositionContainerオブジェクトで別々に指定したパーツがめでたく合成されました。
実行結果は
-------------------
B Say
上記を下記のようにAとBをひっくり返すと合成に失敗します。
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new [] { typeof(B) }))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] {typeof (A)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
System.ComponentModel.Composition.ImportCardinalityMismatchException はハンドルされませんでした。
Message=制約 '((exportDefinition.ContractName == "MEFSample.IA") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "MEFSample.IA".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))' に一致する有効なエクスポートが見つかりませんでした。無効なエクスポートが拒否されている可能性があります。
Source=System.ComponentModel.Composition
StackTrace:
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportsCore(Type type, Type metadataViewType, String contractName, ImportCardinality cardinality)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValueCore[T](String contractName, ImportCardinality cardinality)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T](String contractName)
場所 System.ComponentModel.Composition.Hosting.ExportProvider.GetExportedValue[T]()
場所 MEFSample.Program.Main(String[] args) 場所 c:¥users¥art55¥documents¥visual studio 2010¥Projects¥MEFSample¥MEFSample¥Program.cs:行 17
場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Threading.ThreadHelper.ThreadStart()
InnerException:
まあこんな使い方はしないですね・・・。たぶん。
----
追記)
class Program
{
static void Main(string[] args)
{
var catalogExportProvider = new CatalogExportProvider(new TypeCatalog(new Type[0]))
{
SourceProvider =
new CompositionContainer(new TypeCatalog(new[] { typeof(A), typeof (B)}))
};
IA a = catalogExportProvider.GetExportedValue<IA>();
a.Say();
}
}
これもダメでした・・・・うん??