WPF выбрасывает управляющее исключение «ресурс, идентифицируемый отсутствующим URI» - PullRequest
18 голосов
/ 14 февраля 2011

При загрузке плагина и попытке создать элемент управления 'XYZ' приложение выдает следующее исключение:

"Компонент XYZ не имеет ресурс идентифицирован URI "/ThePluginAssembly;component/XYZ.xaml» на метод InitializeComponent () в конструктор UserControls.

Ключевые моменты:

  1. Пользовательский элемент управления находится в сборке плагина

  2. Я пытаюсь создать пользовательский контроль внутри сборки плагина

  3. Плагины находятся в том же каталоге, что и основное приложение

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

При работе с Google я понял, что это происходит, когда в приложение загружаются два экземпляра моего плагина. Когда я удалил свой плагин из одной из папок (я разрешаю загрузку этого плагина из двух мест), это исключение перестало повторяться.

Мои вопросы:

1) В чем причина того, что WPF пытается разрешить URI для загрузки моего элемента управления?

2) Нет ли способа, которым я мог бы загрузить два экземпляра моего плагина в приложение и каким-то образом избавиться от этого исключения? или каким-либо образом создать уникальный URI для каждого экземпляра (если это исключение вызвано конфликтующим URI).

Любой комментарий или ссылка будут полезны.

Спасибо за ваш интерес.

Edit: Та же проблема, что и Фил: Как заставить WPF использовать URI ресурсов, которые используют строгое имя сборки? Argh!

Ответы [ 5 ]

9 голосов
/ 03 марта 2011

Единственный способ сделать это - включить информацию о версии в ваш URI, чтобы загрузчик XAML мог определить правильный тип. В этой статье MSDN поясняется формат пакета URI, а в разделе «Версия» есть описание:

; Версия [необязательная]: версия ссылочной сборки, которая содержит файл ресурсов. Это используется, когда загружены две или более ссылочных сборки с одинаковым коротким именем.

Итак, вы хотите использовать одно из следующих:

/ThePluginAssembly;v1.0.0.0;component/XYZ.xaml
/ThePluginAssembly;v1.1.0.0;component/XYZ.xaml
2 голосов
/ 14 июня 2013

попробуйте использовать Assembly.LoadFrom() вместо Assembly.Load() или Assembly.LoadFile().

У меня была та же проблема: я использовал для загрузки сборок с Assembly.LoadFile().После поисков в течение нескольких дней я обнаружил, что Assembly.LoadFile() и Assembly.Load() устарели.Оба метода создают проблемы во время выполнения.Поэтому я использовал Assembly.LoadFrom(), и это сработало.

1 голос
/ 07 марта 2011

Следующие указания относятся как к сборке плагина, так и к любой несистемной сборке, на которую ссылается плагин (дублирование может быть на любом уровне ссылок).

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

Проверьте все ссылки на сборку в вашем решении и задайте для "Верной версии" значение false.

Если сборка плагина из другого решения и вы используете разные версии сборки для отладки / выпуска или для x86 / x64, то отредактируйте файлы .csproj, которые ссылаются на сборку, и задайте путь ссылки, как в в этом примере .

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

Убедитесь, что Pack URI для ресурсов имеет вид: "Пакет: // Применение: ,,, / ReferencedAssembly; компонент / подпапки / ResourceFile.xaml"

0 голосов
/ 15 ноября 2013

Скопируйте все файлы из папки bin в отдельную папку из всех проектов, находящихся в вашем решении, и удалите папку отладки и выпуска из папки bin каждого проекта.Это решило проблему дизайнера для меня.

Помните, что при следующей компиляции все файлы вернутся снова.Таким образом, вы должны иметь некоторый скрипт в пост-сборке, чтобы скопировать в другую папку и удалить файлы из папки bin.

0 голосов
/ 06 марта 2011

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

Итак, если изначально это был "prod.myplugin", то теперь я сделал это "prod.myplugin_300d3". После изменения свойств проекта, когда я перестраиваю свой проект, компилятор регенерирует файлы .g.cs, и теперь у него есть версия в URI (он отображается как /prod.myplugin_300d3;component/XYZ.xaml) и, таким образом, делает мой URI уникальным. в разных версиях.

Я все еще ищу лучшее, автоматизированное решение, где я мог бы изменить конфигурацию MSBuild: Compile.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...