VinVan81 Ответов: 1

MEF ничего не импортирует, если какой-либо найденный компонент реализует свой интерфейс неправильно


Привет,

я пытаюсь реализовать программное обеспечение с помощью платформы управляемой расширяемости (MEF). Он работает, но если в каталоге есть компонент, который экспортирует интерфейс, который контейнер должен импортировать, но реализация недопустима и реализует только один метод не так, как нужно, метод ComposeParts()-метод выдает исключение, и после этого я ничего не получаю в контейнере.
Я ожидал, что все правильно реализованные компоненты находятся в контейнере, и только недопустимый из них отклоняется.

Я что-то пропустил, что я должен настроить или установить любым методом или чем-то еще в рамках управляемой расширяемости, поэтому он просто отклоняет недопустимые компоненты, но сохраняет или получает все правильные компоненты.

вот исключение:
(на немецком языке ... огорченный^^)
исключение загрузчика: Die Methode "" ProductionStart ""im Typ "" roboVision.Приобретение.TestImpl_1_IAcquisition"" дер "монтажно"Acquisition_TI, версия=1.0.0.0, культуры=нейтральный, значения PublicKeyToken=null" в" Кейне шляпа Implementierung.

(перевод: метод ""ProductionStart"" в тип ..... не имеет реализации.)

после этого в контейнере уже ничего нет. Но есть много других компонентов других видов экспорта. если я удалю недопустимый файл из папки, все остальные будут добавлены в контейнер правильно.

Надеюсь, я смогу написать это понятно, и вы мне поможете.
Заранее спасибо
Vin

1 Ответов

Рейтинг:
1

VinVan81

Хорошо... я ее разгадал! \о/

если у кого-то еще есть подобная проблема, вот мой код:

//An aggregate catalog that combines multiple catalogs
var catalog = new AggregateCatalog();
//Adds all the parts found in the same assembly as the Program class
catalog.Catalogs.Add(new AssemblyCatalog(typeof(Kernel).Assembly));
//catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));

foreach (var file in Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory))
{
    if (file.EndsWith(".dll"))
    {
        var tmpCatalog = new AggregateCatalog();
        try
        {
            tmpCatalog.Catalogs.Add(new AssemblyCatalog(file));
            CompositionContainer tmpContainer = new CompositionContainer(tmpCatalog);
            tmpContainer.ComposeParts(this);
            tmpContainer.Dispose();
            //this will only executed, if the former trail to compose doesn't cause an exception
            // after this, the catalog should only contain assemblies, which could be composed later
            catalog.Catalogs.Add(new AssemblyCatalog(file));
        }
        catch (ReflectionTypeLoadException rtlEx)
        {
            logger.Log(LogLevel.Error, "ReflectionTypeLoadException while trying to add " + file.ToString() + " : " + rtlEx.Message + "\r\n" + rtlEx.StackTrace);
            //System.Windows.Forms.MessageBox.Show("ReflectionTypeLoadException while trying to add " + file.ToString() + " : " + rtlEx.Message + "\r\n" + rtlEx.StackTrace);
            foreach (Exception _ex in rtlEx.LoaderExceptions)
            {
                logger.Log(LogLevel.Error, "   loader exception: " + _ex.Message + "\r\n" + _ex.StackTrace);
                //System.Windows.Forms.MessageBox.Show("   loader exception: " + _ex.Message + "\r\n" + _ex.StackTrace);
            }
        }
        catch (Exception ex)
        {
            logger.Log(LogLevel.Error, "Exception while trying to add " + file.ToString() + " : " + ex.Message + "\r\n" + ex.StackTrace);
            //System.Windows.Forms.MessageBox.Show("Exception while trying to add " + file.ToString() + " : " + ex.Message + "\r\n" + ex.StackTrace);
        }
    }
            
}

//Create the CompositionContainer with the parts in the catalog
_container = new CompositionContainer(catalog);



//Fill the imports of this object
try
{
                    
    this._container.ComposeParts(this);
}
catch (CompositionException compositionException)
{
    logger.Log(LogLevel.Error, "error at composing parts: " + compositionException.Message + "\r\n" + compositionException.StackTrace);
    System.Windows.Forms.MessageBox.Show("error at composing parts: " + compositionException.Message + "\r\n" + compositionException.StackTrace);
                    
}
catch (CompositionContractMismatchException contractMissmatchEx)
{
    logger.Log(LogLevel.Error, "contract missmatch: " + contractMissmatchEx.Message + "\r\n" + contractMissmatchEx.StackTrace);
    System.Windows.Forms.MessageBox.Show("contract missmatch: " + contractMissmatchEx.Message + "\r\n" + contractMissmatchEx.StackTrace);
}
catch (ReflectionTypeLoadException typeLoadEx)
{
    logger.Log(LogLevel.Error, "type load exception: " + typeLoadEx.Message + "\r\n" + typeLoadEx.StackTrace);
    System.Windows.Forms.MessageBox.Show("type load exception: " + typeLoadEx.Message + "\r\n" + typeLoadEx.StackTrace);
    foreach (Exception _ex in typeLoadEx.LoaderExceptions)
    {
        logger.Log(LogLevel.Error, "   loader exception: " + _ex.Message + "\r\n" + _ex.StackTrace);
        System.Windows.Forms.MessageBox.Show("   loader exception: " + _ex.Message + "\r\n" + _ex.StackTrace);
    }
}