私はMEF(System.Composition)を介してプラグインコンストラクタにパラメータを渡す方法を理解しようと数時間を費やしましたが、それは役に立たないものです。言うまでもなく、適切なドキュメントがほとんどなく、ソースコードを見ても役に立たなかった。.NETコアでMEF経由でプラグインコンストラクタにパラメータを渡しますか?
これは、CompositionHost.ComposeExportedValueメソッドを使用して、実際には簡単でしたが、.NET Coreバージョンでは動作するものが見つからないようです。私は、不完全なコードを以下で囲み、例外がスローされました。
この点に関するお手伝いがあれば幸いです。一部の>輸入で必要とされる 'コード' - おかげで....
using System;
using System.Composition;
using System.Composition.Hosting;
using System.Reflection;
namespace MefMe
{
public interface IPlugin
{
void Alert();
}
[Export(typeof(IPlugin))]
public class Plugin : IPlugin
{
private string code;
[ImportingConstructor]
public Plugin(string code)
{
this.code = code;
}
public void Alert() => Console.WriteLine(code);
}
class Program
{
static void Main(string[] args)
{
var config = new ContainerConfiguration()
.WithAssembly(Assembly.GetEntryAssembly());
var container = config.CreateContainer();
// Throws a CompositionFailedException; see notes
var plugin = container.GetExport<IPlugin>();
plugin.Alert();
}
}
}
System.Composition.Hosting.CompositionFailedExceptionが発生した
HRESULT = 0x80131500メッセージ=いいえ輸出は、契約 '文字列' が見つかりませんでした'プラグイン' - >契約のための最初の要求 'IPlugin' ソース=のStackTraceで を必要と: System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency 依存、HashSetの1 checked, Stack
1チェック)で System.Composition.Hostingで。 Core.ExportDescriptorRegistryUpdate.CheckDepend System.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.Execute(CompositionContract でSystem.Composition.Hosting.Core.ExportDescriptorRegistryUpdate.CheckTarget(CompositionDependency 依存、HashSetの1 checked, Stack
1チェック)でency(CompositionDependency 依存、HashSetの1 checked, Stack
1チェック) Systeで System.Composition.Hosting.Core.LifetimeContext.TryGetExport(CompositionContract 契約で System.Composition.Hosting.Core.ExportDescriptorRegistry.TryGetSingleForExport(CompositionContract exportKey、ExportDescriptor & defaultForExport)、オブジェクト&輸出)で契約) System.Composition.CompositionContext.GetExport(CompositionContract コントラクト) のMe:Me.Main(String [] args)デスクトップ\ MefMe \ MefMe \ Program.cs:行36