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

Да, это действительно раздражает, я заметил ранее, что код, сгенерированный WPF для загрузки ресурсов XAML, похоже, не использует строгие имена и, следовательно, может быть проблематичным для сценариев, когда вам необходимо поддерживать параллельные версии сборок WPF.

Это оказалось так, и этоТеперь это вызывает у меня проблемы - у меня есть система плагинов, которая должна поддерживать параллельную установку плагинов, которые отличаются только номерами версий (версиями сборки). Это, конечно, может поддерживаться .NET, поскольку сборки имеют разные идентификаторы, даже если они имеют одно и то же имя файла DLL, при условии, что они имеют строгое имя и либо имеют открытый / закрытый ключ, либо имеют другой номер версии сборки.

Теперь, если мы посмотрим на код, сгенерированный для windows и usercontrols Visual Studio, мы увидим в автоматически сгенерированном файле следующее:

/// 
/// InitializeComponent
/// 
[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 проверит вызывающую сборкуличность и использовать егоs открытый ключ и сведения о версии или, возможно, проверьте идентичность сборки, которая содержит тип для 'этот' параметр.

Похоже, что это не так - если у вас есть две сборки с разными номерами версий (но с одинаковым именем файла), вы можете получить IOException с сообщением "Не удается найти ресурс X " (для приведенного выше примера "Не могу найти ресурс 'просмотров / servicepanelui.xaml.

Хуже яЯ вполне уверен, что это также будет означать, что сборки с одинаковым именем файла, но с разным открытым / закрытым ключом, то есть от разных издателей, также приведут к этой ошибке.

Итак, кто-нибудь знает, как обойти это? Как сделать WPF совместимым со строгим именем.

Обратите внимание, насколько яЯ обеспокоен тем, что это ошибка WPF. Ты не долженЧтобы избежать этого, нужно использовать изоляцию Appdomain.

Ответы на вопрос(7)

Ваш ответ на вопрос