После того как я рассмотрел свой последний вопрос (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
-плагина правильно загружает его компонент, когда его старая версия существует в контексте загрузки по умолчанию?