Хорошо, это действительно раздражает, я ранее заметил, что код, сгенерированный WPF для загрузки ресурсов XAML, похоже, не использует строгие имена и, следовательно, может быть проблематичным для сценариев, где вам необходимо поддерживать параллельные версии сборок WPF.
Оказалось, что это так, и теперь это вызывает у меня проблемы - у меня есть система плагинов, которая должна поддерживать параллельную установку плагинов, которые отличаются только номерами версий (версиями сборки). Это, конечно, может поддерживаться .NET, поскольку сборки определяются как имеющие разные идентификаторы, даже если они имеют одно и то же имя файла DLL, при условии, что они имеют строгое имя и либо имеют другой открытый / закрытый ключ, либо имеют другой номер версии сборки.
Теперь, если мы посмотрим на код, сгенерированный Visual Studio для окон и пользовательских элементов управления, мы увидим в автоматически сгенерированном файле следующее:
/// <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» (например, «Невозможно найти представления ресурса / панели обслуживания» .xaml '.
Хуже того, я почти уверен, что это также будет означать, что сборки с тем же именем файла, но с другим открытым / закрытым ключом, то есть от разных издателей, также приведут к этой ошибке.
Итак, кто-нибудь знает, как это обойти? Как обеспечить соответствие строгого имени WPF.
Обратите внимание, насколько я понимаю, это ошибка WPF. Чтобы избежать этого, не следует использовать изоляцию домена приложений.