Хорошо, это действительно раздражает, я уже заметил, что код, созданный WPF для загрузки ресурсов XAML, по-видимому, не использовал сильные имена и поэтому может быть проблематичным для сценариев, в которых вам необходимо поддерживать бок о бок версии сборки WPF.
Это оказалось так, и теперь это вызывает у меня проблемы. У меня есть подключаемая система, которая должна поддерживать бок о бок установку плагинов, которые отличаются только номерами их версий (их версиями сборки). Это, конечно, может поддерживаться .NET, поскольку сборки имеют разные идентификаторы, даже если они имеют одинаковое имя файла DLL при условии, что они сильно пронумерованы и имеют другой открытый/закрытый ключ или имеют другой номер версии сборки.
Теперь, если мы посмотрим на код, созданный для окон и usercontrols визуальной студией, мы увидим в автогенерированном файле следующее:
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/Sensormatic.AMK1000.Panel;component/views/servicepanelui.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Views\ServicePanelUI.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
Обратите внимание на строку, в которой создается локатор ресурсов - он использует относительный URI, который не указывает сильное имя или версию сборки, которая содержит ресурс xaml.
Я подумал, что, возможно, LoadComponent проверит идентификатор вызывающей сборки и будет использовать его как открытый ключ и информацию о версии, так и, возможно, проверить личность сборки, которая содержит тип для параметра 'this'.
Похоже, что это не так - если у вас есть две сборки с разными номерами версий (но одно и то же имя файла), тогда вы можете получить IOException с сообщением "Невозможно найти ресурс X" (для примера выше "Невозможно найти ресурс", просмотров /servicepanelui.xaml.
Хуже того, я уверен, что это также означает, что сбои с тем же именем файла, но с другим открытым/закрытым ключом, то есть от разных издателей, также приведут к этой ошибке.
Итак, кто-нибудь знает, как обойти это? Как сделать WPF прочным именем.
Заметьте, насколько мне известно, это ошибка WPF. Вам не нужно использовать изоляцию Appdomain, чтобы избежать этого.