C# Проблема с загрузкой компонента MEF ResourceDictionary при наличии нескольких версий одной и той же библиотеки DLL - PullRequest
0 голосов
/ 06 мая 2020

После того как я рассмотрел свой последний вопрос (C# неожиданный результат MEF DirectoryCatalog с идентичным именем файла DLL ), используя вместо него AssemblyCatalog, у меня возникла другая проблема.

( Моя последняя проблема возникла, когда наш клиент неправильно разместил старый DLL -файл. Они должны быть в подпапке /libs, но клиент поместил его в ту же папку с EXE, а новый DLL -файл в нужном месте одновременно. В итоге был загружен старый DLL. Причина проблемы была DirectoryCatalog.)

Мой MEF -плагин имеет ResourceDictionary, который содержит внутри несколько DataTemplate. Я обнаружил, что InitializeComponent из этого ResourceDictionary пытался сначала загрузить компоненты из рабочего каталога приложения по умолчанию, а не из папки плагинов (/libs), и завершает поиск, когда успешно загружает неверный DLL.

///AutoGenerated InitializeComponent of ResourceDictionary of plugin

[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
    if (_contentLoaded) {
        return;
    }
    _contentLoaded = true;
    System.Uri resourceLocater = new System.Uri("/PluginName;component/app.xaml", System.UriKind.Relative);

    #line 1 "..\..\App.xaml"
    System.Windows.Application.LoadComponent(this, resourceLocater); //with fuslogvw, I can see this line loads wrong old dll file.

    #line default
    #line hidden
}

Я думал, что могу решить эту проблему, переопределив InitializeComponent, например, изменив resourceLocater на путь к папке плагина, но он не загрузился, когда я попытался, например “/libs/PluginName;component/app.xaml”, System.UriKind.Relative. Я также попытался просто не вызывать метод InitializeComponent, и обнаружил, что не вызывая его, при создании экземпляра ResourceDictionary становится пустым.

Итак, мой вопрос: Как я могу сделать свой ResourceDictionary внутри MEF -плагина правильно загружает его компонент, когда его старая версия существует в контексте загрузки по умолчанию?

...