Wie zu zwingen, WPF zu verwenden, Ressourcen-URIs, die Verwendung assembly mit starkem Namen? Argh!

O. k, das ist wirklich irritierend, ich hatte zuvor aufgefallen, dass der erzeugte code von WPF für das laden von XAML-Ressourcen nicht erscheinen, verwenden Sie eindeutige Namen und können daher problematisch sein, für Szenarien, in denen Sie benötigen, um support-side-by-side-Versionen von WPF-Assemblys.

Dieser hat stellte sich heraus, der Fall zu sein, und es ist jetzt was mir Probleme - ich habe ein plug-in system unterstützen soll, side-by-side-installation von plugins, die unterscheiden sich nur in Ihrer version zahlen (Ihre assembly-Versionen). Dies kann natürlich unterstützt werden .NET seit Baugruppen ermittelt werden, um verschiedene Identitäten, auch wenn Sie die gleiche DLL mit dem Namen, vorausgesetzt, Sie sind stark Namen und entweder einer anderen öffentlichen/privaten Schlüssel haben ODER eine andere assembly-version-Nummer.

Nun, wenn wir uns den generierten code für windows und Benutzersteuerelemente von visual studio, sehen wir in der automatisch generierten Datei die folgenden:

///<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
}

Beachten Sie die Zeile, wo die Ressource locater ist erstellt - es ist mit einem relativen URI die nicht angeben, der starke name oder die version der assembly enthält den xaml-Ressource.

Dachte ich, vielleicht LoadComponent würde prüfen, ob der aufrufenden assembly, der die Identität und den öffentlichen Schlüssel und die version details oder vielleicht überprüfen die Identität der assembly, welche den Typ enthält, für den "this" - parameter.

Es scheint dies nicht der Fall ist - wenn Sie zwei Baugruppen mit unterschiedlichen Versionsnummern (aber den gleichen Dateinamen), dann bekommen Sie eine IOException mit der Meldung "Cannot locate resource-X" (für das obige Beispiel "Cannot locate resource 'views/servicepanelui.xaml'.

Schlimmer noch, ich bin mir ziemlich sicher, dass dies auch bedeuten wird, dass Assemblys mit dem gleichen Dateinamen, aber unterschiedlichen öffentlichen/privaten Schlüssel, D. H. von verschiedenen Verlagen, auch dieser Fehler führen.

So, weiß jemand wie man das umgehen kann? Wie man WPF starken Namen-konform.

Hinweis, so weit ich bin besorgt das ist ein WPF-bug. Sie sollten es nicht verwenden, Appdomain-Isolierung einfach, dies zu vermeiden.

  • Hallo Phil, ich bin vor dem gleichen Problem. Sie waren in der Lage zu finden, eine Lösung für dieses?
  • Hat jemand vor ähnlichen problem mit WPF Custom controls verwenden von Themen(durch Ressourcen-Wörterbücher)? Wenn ja, irgendeine Lösung dafür?
  • irgendwelche news dazu?
  • Gibt es irgendwelche Fortschritte auf diesem? Sicherlich Menschen sind in der Lage, zum erstellen von WPF-Bibliotheken ohne dieses problem. Muss ich aber haben genau dieses Problem.
InformationsquelleAutor Phil | 2009-09-21
Schreibe einen Kommentar